2012-01-16 9 views
30

Sono confuso ma in javascript:in JavaScript: Perché new Date ('2012/01/15') - new Date ('2012-01-15') == 21.600.000

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

Perché quella? (21 milioni seicento mille/1000/3600 == 6 ore)

+4

Stampa qui 14400000, ovvero 4 ore. Sono a GMT-4. Questo è probabilmente correlato :) – BalusC

+2

Fallisce per me - il 2012-1-15 restituisce una data non valida invece di un oggetto data (FF 9.0.1), causando il tutto per restituire NaN. –

+0

Ottengo 18000000, 5 ore, e io sono GMT-5 ... Sono con @BalusC su questo. –

risposta

37

il formato data yyyy-mm-dd (2012-01-15) è analizzato come una data UTC mentre yyyy-m-dd (2012/01/15) viene analizzato come data locale. Questo è mostrato se si utilizza .toString su ciascuno.

> (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)" 

Nota che sono in California, da qui l'ora solare del Pacifico. Se ti trovi in ​​un fuso orario diverso, otterrai risultati diversi.

Quando JavaScript analizza le date, prova prima i formati utilizzati in più aree (come l'UTC) prima di provare i formati di data localizzati. L'ultima parte del formato di data UTC è una differenza di fuso orario rispetto a GMT che si presume essere 0 quando manca (come in questo esempio). Per ottenere la stessa data è necessario il timestamp UTC completo: 2012-01-15T00: 00: 00-08: 00.

+6

sarebbe interessante sapere/perché/questo accade. – Hamish

+0

@Hamish Ho aggiunto un po 'di spiegazione, fammi sapere se dovrei andare più in profondità. –

+3

Molto strano, da allora, come dovrebbe essere analizzato il 2012-10-15? non può essere sia utc che locale. –

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

Per il primo caso, la funzione costruttore imposta l'ora 00:00 nel fuso orario. Ma nel secondo caso, inizializza il tempo relativo a GMT +00.00

10

Il risultato di new Date('2012-1-15') dipende dall'implementazione (ECMAScript standard, clausola 15.9.4.2).

Problemi correlati