Bu yazı itibariyle, diğer yanıtlardan sadece biri DST (gün ışığından yararlanma saati) geçişlerini doğru şekilde işler. California'da bulunan bir sistemde sonuçlar:
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
Math.round
Doğru sonuçları döndürmesine rağmen , bunun biraz tıknaz olduğunu düşünüyorum. Bunun yerine, DST başladığında veya bittiğinde UTC ofsetindeki değişiklikleri açıkça hesaplayarak kesin aritmetiği kullanabiliriz:
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()));
açıklama
JavaScript tarih hesaplamaları zordur çünkü Date
nesneler zamanları yerel saatle değil dahili olarak UTC'de depolar. Örneğin, 3/10/2013 12:00 AM Pasifik Standart Saati (UTC-08: 00) 3/10/2013 8:00 AM UTC ve 3/11/2013 12:00 AM Pasifik Yaz Saati ( UTC-07: 00) 11.03.2013 07:00 UTC olarak saklanır. Bu gün, gece yarısından gece yarısına kadar yerel saat UTC'de sadece 23 saattir!
Yerel saatteki bir günün 24 saatten fazla veya daha az olmasına rağmen, UTC'de bir gün her zaman tam olarak 24 saattir. 1daysBetween
Yukarıda gösterilen metot, birinci arama bu gerçeğinden yararlanır treatAsUTC
çıkarılarak ve bölünmeden önce, gece UTC'ye hem yerel zamanları ayarlamak üzere.
1. JavaScript artık saniyeleri yok sayar.