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.roundmengembalikan 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 daysBetweenMetode yang ditunjukkan di atas mengambil keuntungan dari fakta ini dengan panggilan pertama treatAsUTCuntuk menyesuaikan kedua kali lokal untuk tengah malam UTC, sebelum mengurangi dan membagi.
1. JavaScript mengabaikan lompatan detik.