Pada tulisan ini, hanya satu dari jawaban lain yang dengan benar menangani transisi DST (waktu musim panas). Berikut adalah hasil pada sistem yang berlokasi 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 Math.round
mengembalikan hasil yang benar, saya pikir itu agak kikuk. Alih-alih, dengan secara eksplisit memperhitungkan perubahan pada offset UTC ketika DST dimulai atau berakhir, kita dapat menggunakan aritmatika yang tepat:
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()));
Penjelasan
Perhitungan tanggal JavaScript rumit karena Date
objek menyimpan waktu 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 Pacific Daylight Time ( UTC-07: 00) disimpan sebagai 3/11/2013 07:00 UTC. Pada hari ini, tengah malam hingga tengah malam waktu setempat hanya 23 jam di UTC!
Meskipun satu hari dalam waktu setempat dapat memiliki lebih atau kurang dari 24 jam, satu hari di UTC selalu tepat 24 jam. 1 The daysBetween
Metode yang ditunjukkan di atas mengambil keuntungan dari fakta ini dengan panggilan pertama treatAsUTC
untuk menyesuaikan kedua kali lokal untuk tengah malam UTC, sebelum mengurangi dan membagi.
1. JavaScript mengabaikan lompatan detik.