Bagaimana cara mendapatkan jumlah hari antara dua tanggal di JavaScript? Misalnya, diberikan dua tanggal di kotak input:
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script>
Berikut adalah cepat dan kotor pelaksanaan datediff
, sebagai bukti konsep untuk memecahkan masalah seperti yang disajikan dalam pertanyaan. Hal ini bergantung pada kenyataan bahwa anda bisa mendapatkan berlalu milidetik antara dua tanggal dengan mengurangkan mereka, yang memaksa mereka primitif jumlah nilai (milidetik sejak awal tahun 1970).
// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
var mdy = str.split('/');
return new Date(mdy[2], mdy[0]-1, mdy[1]);
}
function datediff(first, second) {
// Take the difference between the dates and divide by milliseconds per day.
// Round to nearest whole number to deal with DST.
return Math.round((second-first)/(1000*60*60*24));
}
alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
Anda harus menyadari bahwa "normal" Tanggal APIs (tanpa "UTC" dalam nama) beroperasi di zona waktu lokal pengguna's browser, sehingga anda dapat menjalankan ke dalam masalah jika anda berada di zona waktu yang anda don't harapkan, dan kode anda akan harus berurusan dengan Daylight Saving Time transisi. Anda harus hati-hati membaca dokumentasi untuk Upload objek dan metode, dan untuk sesuatu yang lebih rumit, sangat mempertimbangkan menggunakan perpustakaan yang menawarkan lebih aman dan kuat Api untuk tanggal manipulasi.
Juga, untuk tujuan ilustrasi, cuplikan menggunakan bernama akses pada jendela
objek untuk singkatnya, tetapi dalam produksi anda harus menggunakan standar Api seperti getElementById, atau lebih mungkin, beberapa kerangka UI.
Seperti tulisan ini, hanya satu jawaban dengan benar menangani DST (daylight saving time) transisi. Berikut ini adalah hasil pada sistem yang terletak di California:
1/1/2013- 3/10/2013- 11/3/2013-
User Formula 2/1/2013 3/11/2013 11/4/2013 Result
--------- --------------------------- -------- --------- --------- ---------
Miles (d2 - d1) / N 31 0.9583333 1.0416666 Incorrect
some Math.floor((d2 - d1) / N) 31 0 1 Incorrect
fuentesjr Math.round((d2 - d1) / N) 31 1 1 Correct
toloco Math.ceiling((d2 - d1) / N) 31 1 2 Incorrect
N = 86400000
Meskipun Matematika.bulat
kembali hasil yang benar, saya pikir itu's agak kikuk. Sebaliknya, dengan secara eksplisit akuntansi untuk perubahan UTC offset ketika DST dimulai atau berakhir, kita dapat menggunakan tepat aritmatika:
function treatAsUTC(date) {
var result = new Date(date);
result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
return result;
}
function daysBetween(startDate, endDate) {
var millisecondsPerDay = 24 * 60 * 60 * 1000;
return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}
alert(daysBetween($('#first').val(), $('#second').val()));
JavaScript upload perhitungan yang rumit karena Tanggal
benda-benda toko kali secara internal dalam UTC, bukan waktu setempat. Misalnya, 3/10/2013 12:00 AM Waktu Standar Pasifik (UTC-08:00) disimpan sebagai 3/10/2013 8:00 AM UTC, dan 3/11/2013 12:00 AM Waktu musim panas Pasifik (UTC-07:00) disimpan sebagai 3/11/2013 7:00 AM UTC. Pada hari ini, tengah malam ke tengah malam waktu setempat hanya 23 jam dalam UTC!
Meskipun hari waktu setempat dapat memiliki lebih atau kurang dari 24 jam, hari, dalam UTC selalu tepat 24 jam.1 daysBetween
metode yang ditunjukkan di atas mengambil keuntungan dari fakta ini dengan pertama-tama menyebut treatAsUTC
untuk menyesuaikan waktu setempat hingga tengah malam UTC, sebelum mengurangi dan membagi.
1. JavaScript mengabaikan lompatan detik.
Cara termudah untuk mendapatkan perbedaan antara dua tanggal:
var diff = Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000);
Anda mendapatkan selisih hari (atau NaN jika salah satu atau keduanya tidak bisa diurai). Parse tanggal diperolehkan hasil dalam milidetik dan untuk mendapatkan hal ini di siang hari anda harus dibagi dengan 24 60 60 * 1000
Jika anda ingin dibagi dengan hari, jam, menit, detik, dan milidetik:
function dateDiff( str1, str2 ) {
var diff = Date.parse( str2 ) - Date.parse( str1 );
return isNaN( diff ) ? NaN : {
diff : diff,
ms : Math.floor( diff % 1000 ),
s : Math.floor( diff / 1000 % 60 ),
m : Math.floor( diff / 60000 % 60 ),
h : Math.floor( diff / 3600000 % 24 ),
d : Math.floor( diff / 86400000 )
};
}
Di sini saya refactored versi James version:
function mydiff(date1,date2,interval) {
var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
date1 = new Date(date1);
date2 = new Date(date2);
var timediff = date2 - date1;
if (isNaN(timediff)) return NaN;
switch (interval) {
case "years": return date2.getFullYear() - date1.getFullYear();
case "months": return (
( date2.getFullYear() * 12 + date2.getMonth() )
-
( date1.getFullYear() * 12 + date1.getMonth() )
);
case "weeks" : return Math.floor(timediff / week);
case "days" : return Math.floor(timediff / day);
case "hours" : return Math.floor(timediff / hour);
case "minutes": return Math.floor(timediff / minute);
case "seconds": return Math.floor(timediff / second);
default: return undefined;
}
}
Saya sarankan menggunakan moment.js perpustakaan (http://momentjs.com/docs/#/displaying/difference/). Menangani daylight savings time dengan benar dan secara umum lebih besar untuk bekerja dengan.
Contoh:
var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1
Aku akan pergi ke depan dan ambil utilitas kecil ini dan di dalamnya anda akan menemukan fungsi ini untuk anda. Berikut ini's contoh singkat:
<script type="text/javascript" src="date.js"></script>
<script type="text/javascript">
var minutes = 1000*60;
var hours = minutes*60;
var days = hours*24;
var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");
var diff_date = Math.round((foo_date2 - foo_date1)/days);
alert("Diff date is: " + diff_date );
</script>
const startDate = '2017-11-08';
const endDate = '2017-10-01';
const timeDiff = (new Date(startDate)) - (new Date(endDate));
const days = timeDiff / (1000 * 60 * 60 * 24)
Update: Aku tahu ini bukan bagian dari pertanyaan anda, tapi secara umum saya tidak akan merekomendasikan untuk dilakukan setiap tanggal perhitungan atau manipulasi di vanilla JavaScript dan bukan menggunakan perpustakaan seperti tanggal-fns atau moment.js untuk itu karena banyak kasus tepi.
Menggunakan Moment.js
var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>
Tanggal nilai-nilai di JS adalah nilai-nilai datetime.
Jadi, langsung upload perhitungan yang tidak konsisten:
(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day
misalnya kita perlu mengkonversi de 2 tanggal:
(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day
metode ini bisa memotong mills di kedua tanggal:
var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);
date2 = new Date('2013/11/05 00:00:00'); //1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);
Untuk Menghitung hari-hari antara 2 tanggal tertentu anda dapat menggunakan kode berikut.Tanggal yang saya gunakan di sini adalah Jan 01 2016 dan 31 Desember 2016
var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p>
Hal ini dimungkinkan untuk menghitung penuh bukti perbedaan hari antara dua tanggal beristirahat di berbagai TZs menggunakan rumus sebagai berikut:
var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);
Lebih baik untuk menyingkirkan DST, Matematika.ceil, Matematika.lantai dll. dengan menggunakan UTC kali:
var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf()
- secondDate.valueOf())/(24*60*60*1000));
Contoh ini memberikan perbedaan 109 hari. 24*60*60*1000
adalah satu hari dalam milidetik.
Saya menemukan pertanyaan ini ketika saya ingin melakukan beberapa menghitung pada dua tanggal, tapi tanggal, jam dan menit nilai, aku dimodifikasi @michael-liu 's jawaban yang sesuai kebutuhan saya, dan lulus tes.
diff hari 2012-12-31 23:00
dan 2013-01-01 01:00
harus sama dengan 1. (2 jam)
diff hari 2012-12-31 01:00
dan 2013-01-01 23:00
harus sama dengan 1. (46 jam)
function treatAsUTC(date) {
var result = new Date(date);
result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
return result;
}
var millisecondsPerDay = 24 * 60 * 60 * 1000;
function diffDays(startDate, endDate) {
return Math.floor(treatAsUTC(endDate) / millisecondsPerDay) - Math.floor(treatAsUTC(startDate) / millisecondsPerDay);
}
Saya pikir solusi aren't benar 100% saya akan menggunakan l bukan lantai, putaran akan bekerja tetapi tidak't hak operasi.
function dateDiff(str1, str2){
var diff = Date.parse(str2) - Date.parse(str1);
return isNaN(diff) ? NaN : {
diff: diff,
ms: Math.ceil(diff % 1000),
s: Math.ceil(diff / 1000 % 60),
m: Math.ceil(diff / 60000 % 60),
h: Math.ceil(diff / 3600000 % 24),
d: Math.ceil(diff / 86400000)
};
}
Bagaimana menggunakan formatDate dari DatePicker widget? Anda bisa menggunakannya untuk mengkonversi tanggal dalam format timestamp (milidetik sejak 01/01/1970) dan kemudian lakukan pengurangan sederhana.
function timeDifference(date1, date2) {
var oneDay = 24 * 60 * 60; // hours*minutes*seconds
var oneHour = 60 * 60; // minutes*seconds
var oneMinute = 60; // 60 seconds
var firstDate = date1.getTime(); // convert to milliseconds
var secondDate = date2.getTime(); // convert to milliseconds
var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
// the difference object
var difference = {
"days": 0,
"hours": 0,
"minutes": 0,
"seconds": 0,
}
//calculate all the days and substract it from the total
while (seconds >= oneDay) {
difference.days++;
seconds -= oneDay;
}
//calculate all the remaining hours then substract it from the total
while (seconds >= oneHour) {
difference.hours++;
seconds -= oneHour;
}
//calculate all the remaining minutes then substract it from the total
while (seconds >= oneMinute) {
difference.minutes++;
seconds -= oneMinute;
}
//the remaining seconds :
difference.seconds = seconds;
//return the difference object
return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date()));
Ini mungkin tidak menjadi solusi yang paling elegan, tetapi tampaknya untuk menjawab pertanyaan dengan waktu yang relatif sederhana sedikit kode, saya pikir. Bisa't anda menggunakan sesuatu seperti ini:
function dayDiff(startdate, enddate) {
var dayCount = 0;
while(enddate >= startdate) {
dayCount++;
startdate.setDate(startdate.getDate() + 1);
}
return dayCount;
}
Ini adalah asumsi anda lewat tanggal objek sebagai parameter.
Berhati-hati ketika menggunakan milidetik.
The tanggal.getTime() kembali milidetik dan melakukan operasi matematika dengan milidetik membutuhkan untuk memasukkan
Contoh dari komentar di atas adalah solusi terbaik yang saya temukan sejauh https://stackoverflow.com/a/11252167/2091095 . Tapi menggunakan +1 untuk hasilnya. jika anda ingin menghitung semua hari-hari yang terlibat.
function treatAsUTC(date) {
var result = new Date(date);
result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
return result;
}
function daysBetween(startDate, endDate) {
var millisecondsPerDay = 24 * 60 * 60 * 1000;
return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}
var diff = daysBetween($('#first').val(), $('#second').val()) + 1;
Date.prototype.days = function(to) {
return Math.abs(Math.floor(to.getTime() / (3600 * 24 * 1000)) - Math.floor(this.getTime() / (3600 * 24 * 1000)))
}
console.log(new Date('2014/05/20').days(new Date('2014/05/23'))); // 3 days
console.log(new Date('2014/05/23').days(new Date('2014/05/20'))); // 3 days
Saya memiliki masalah yang sama dalam Sudut. Saya melakukan copy karena dia akan menimpa kencan pertama. Kedua tanggal tersebut harus memiliki waktu 00:00:00 (jelas)
/*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
$scope.booking.aantalDagen=0;
/*De loper is gelijk aan de startdag van je reservatie.
* De copy is nodig anders overschijft angular de booking.van.
* */
var loper = angular.copy($scope.booking.van);
/*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
while (loper < $scope.booking.tot) {
/*Tel een dag op bij je loper.*/
loper.setDate(loper.getDate() + 1);
$scope.booking.aantalDagen++;
}
/*Start datum telt natuurlijk ook mee*/
$scope.booking.aantalDagen++;
$scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};