2012-01-16 8 views
30

Estoy confundido, pero en javascript:Javascript: ¿Por qué nueva fecha ('01/15/2012') - nuevo ('2012-01-15') == Fecha 21600000

> new Date('2012-1-15') - new Date('2012-01-15') 
    21600000 

¿Por qué es ¿ese? (21600000/1000/3600 == 6 horas)

+4

Se imprime aquí 14400000, que son 4 horas. Estoy en GMT-4. Eso probablemente esté relacionado :) – BalusC

+2

Fallo: el 2012-1-15 devuelve una fecha no válida en lugar de un objeto de fecha (FF 9.0.1), haciendo que todo vuelva NaN. –

+0

Recibo 18000000, 5 horas, y soy GMT-5 ... Estoy con @BalusC en este caso. –

Respuesta

37

El formato de fecha yyyy-mm-dd (2012-01-15) se analiza como una fecha UTC, mientras que yyyy-m-dd (2012-1-15) se analiza como una fecha local. Esto se muestra si usa .toString en cada uno.

> (new Date('2012-01-15')).toString() 
"Sat Jan 14 2012 16:00:00 GMT-0800 (Pacific Standard Time)" 
> (new Date('2012-1-15')).toString() 
"Sun Jan 15 2012 00:00:00 GMT-0800 (Pacific Standard Time)" 

Tenga en cuenta que estoy en California, de ahí la hora estándar del Pacífico. Si te encuentras en un huso horario diferente obtendrás diferentes resultados.

Cuando JavaScript analiza las fechas, intenta formatos utilizados en más áreas (como UTC) antes de probar formatos de fecha localizados. La última parte del formato de fecha UTC es un desplazamiento de zona horaria de GMT que se supone que es 0 cuando falta (como es en este ejemplo). Para obtener la misma fecha, necesitaría la marca de tiempo UTC completa: 2012-01-15T00: 00: 00-08: 00.

+6

sería interesante saber/por qué sucede esto. – Hamish

+0

@Hamish Agregué un poco de explicación, avíseme si debería profundizar más. –

+3

Muy extraño, ¿cómo debería analizarse 2012-10-15? no puede ser tanto utc como local. –

7
a= new Date('2012-1-16') 
b= new Date('2012-01-16') 
alert(a); 
alert(b); 

Para el primer caso, la función constructora establece el tiempo en 00:00 en su zona horaria. Pero en el segundo caso, inicializa el tiempo relativo a GMT +00.00

10

El resultado de new Date('2012-1-15') depende de la implementación (ECMAScript standard, cláusula 15.9.4.2).