2010-03-05 19 views
8

Editar: No es un error como señaló Martin. Estoy cruzando el horario de verano, de ahí la diferencia de 1 hora.Javascript ¿Diferencia de fecha?

quiero para calcular la diferencia en días entre "29 mar 2010" y "mar 09 2010", así que tengo el siguiente código:

((new Date(2010, 2, 29)).getTime() - (new Date(2010, 2, 8)).getTime())/86400000 

86400000 es el número de milisegundos en un día y la diferencia entre las fechas se devuelve en milisegundos, por lo que debería funcionar. Solo que no lo hace del todo. Obtengo

20.958333333333332 

Es la diferencia entre esas 2 fechas que es incorrecta. Se supone que es 1814400000 (21 días se presentarán tiempos 86400000), pero en realidad es 1810800000.

Por otra parte si cambio la diferencia a:

((new Date(2010, 2, 28)).getTime() - (new Date(2010, 2, 7)).getTime())/86400000 

la misma diferencia, solamente desplazado un día de vuelta, me sale la normalidad resultados.

Esto ocurre sólo si tratamos de obtener (x), donde x es después del 29 de marzo de 2010 y que y es antes del 29 de marzo de 2010.

consigo esto en Safari 4 y Firefox 3.6 en Mac, así como IE 8 en Windows 7. No he probado otros navegadores.

¿Estoy haciendo algo mal o se trata de un error conocido?

+1

Su segunda fecha es marzo del 08 de 2010. – SLaks

Respuesta

11

Estás cruzando un límite de horario de verano, de ahí la diferencia de 1 hora.

+0

Sí, tiene razón :) Agregué 3,600,000 a la diferencia de fecha y la división resultó correctamente. Es tonto de mi parte dejar esto pasar. – disc0dancer

+0

DST es el 14 de marzo de este año en los EE. UU. Está incluido en ambos rangos ¿no? –

+0

Estoy en Macedonia, por lo que es diferente en mi máquina, supongo. – disc0dancer

2

El horario de verano permite que la aritmética de la fecha sea algo complicado. Significa que mientras 363 días cada año son 24 horas, un día es 25 horas y un día es solo 23 horas. Personalmente voto por abolir el horario de verano.

En Java, hay una clase GregorianCalendar que data la aritmética correctamente a pesar de DST. Supongo que eso no ayuda mucho en Javascript.

2

(te veo atrapado el cambio de horario de verano)

Cualquier división JavaScript es susceptible de tener problemas-coma flotante establecer la 'precisión' que necesita.

No necesita obtener el tiempo usted mismo, javascript hará la conversión por usted.

+((new Date(2010, 2, 29) - new Date(2010, 2, 8))/ 86400000).toFixed(2) 

/* Valor devuelto: (Número) 20.96 (., Hora local, que puede ser lo que quieren de otra manera, establezca las partes de fecha UTC) */

+1

También podría usar Math.round() en el resultado ya que la diferencia de 1 h nunca será suficiente para generar errores al redondear. Me pregunto cuál es más rápido? – disc0dancer