Al momento della stesura di questo documento, solo una delle altre risposte gestisce correttamente le transizioni di ora legale (ora legale). Ecco i risultati su un sistema situato in 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
Sebbene Math.round
restituisca i risultati corretti, penso che sia un po 'goffo. Invece, tenendo conto esplicitamente delle modifiche all'offset UTC all'inizio o alla fine dell'ora legale, possiamo usare l'aritmetica esatta:
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()));
Spiegazione
I calcoli della data JavaScript sono complicati perché gli Date
oggetti memorizzano i tempi internamente in UTC, non l'ora locale. Ad esempio, 3/10/2013 12:00 AM Pacific Standard Time (UTC-08: 00) viene memorizzato come 3/10/2013 8:00 AM UTC e 3/11/2013 12:00 Pacific Daylight Time ( UTC-07: 00) è memorizzato come 11/03/2013 7:00 UTC. In questo giorno, l'ora locale da mezzanotte a mezzanotte è solo 23 ore in UTC!
Sebbene un giorno nell'ora locale possa avere più o meno di 24 ore, un giorno in UTC è sempre esattamente 24 ore. 1 Il daysBetween
metodo mostrato sopra sfrutta questo fatto chiamando prima treatAsUTC
di regolare entrambe le ore locali a mezzanotte UTC, prima di sottrarre e dividere.
1. JavaScript ignora i secondi bisestili.