Al escribir estas líneas, solo una de las otras respuestas maneja correctamente las transiciones DST (horario de verano). Aquí están los resultados en un sistema ubicado en 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
Aunque Math.round
devuelve los resultados correctos, creo que es algo torpe. En cambio, al contabilizar explícitamente los cambios en el desplazamiento UTC cuando comienza o termina el horario de verano, podemos usar la aritmética exacta:
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()));
Explicación
Los cálculos de fecha de JavaScript son complicados porque los Date
objetos almacenan las horas internamente en UTC, no en la hora local. Por ejemplo, 3/10/2013 12:00 AM Hora estándar del Pacífico (UTC-08: 00) se almacena como 3/10/2013 8:00 AM UTC, y 3/11/2013 12:00 AM Hora del Pacífico ( UTC-07: 00) se almacena como 3/11/2013 7:00 AM UTC. ¡En este día, la medianoche a medianoche hora local es solo 23 horas en UTC!
Aunque un día en la hora local puede tener más o menos de 24 horas, un día en UTC siempre es exactamente 24 horas. 1 El daysBetween
método que se muestra arriba aprovecha este hecho al llamar primero treatAsUTC
para ajustar ambas horas locales a la medianoche UTC, antes de restar y dividir.
1. JavaScript ignora los segundos bisiestos.