W chwili pisania tego tekstu tylko jedna z pozostałych odpowiedzi poprawnie obsługuje przejścia DST (czas letni). Oto wyniki dla systemu zlokalizowanego w Kalifornii:
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
Chociaż Math.round
zwraca poprawne wyniki, myślę, że jest trochę niezgrabny. Zamiast tego, jawnie rozliczając zmiany przesunięcia UTC, gdy DST zaczyna się lub kończy, możemy użyć dokładnej arytmetyki:
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()));
Wyjaśnienie
Obliczanie daty w JavaScript jest trudne, ponieważ Date
obiekty przechowują czasy wewnętrznie w UTC, a nie w czasie lokalnym. Na przykład 03.10.2013 12:00 czasu pacyficznego (UTC-08: 00) jest zapisywany jako 3/10/2013 8:00 UTC, a 03.11.2013 12:00 czasu pacyficznego ( UTC-07: 00) jest przechowywany jako 3/11/2013 7:00 AM UTC. Tego dnia od północy do północy czasu lokalnego jest tylko 23 godziny w UTC!
Chociaż dzień w czasie lokalnym może trwać mniej więcej 24 godziny, dzień w UTC jest zawsze dokładnie 24 godziny. 1 ThedaysBetween
sposób przedstawiony powyżej wykorzystuje ten fakt przez pierwsze powołanie treatAsUTC
do regulacji zarówno razy lokalne do północy UTC, zanim odejmowanie i dzielenie.
1. JavaScript ignoruje sekundy przestępne.