2015-12-02 17 views
51

In Chrome, abbiamo un po 'stranezzaPerché YYYY-MM-DD! = AAAA/MM/DD

> new Date("2014-01-01") - new Date("2014/01/01") 
< 3600000 

E questo perché

new Date("2014-01-01") 
Wed Jan 01 2014 01:00:00 GMT+0100 (CET) 

mentre

new Date("2014/01/01") 
Wed Jan 01 2014 00:00:00 GMT+0100 (CET) 

Perché il '-' sembra aggiungere 1 ora al tempo?

+0

Il mio sta aggiungendo 2 e io sono GMT + 2 – JNF

+0

Sembra che aggiunga il GMT all'ora – JNF

+0

Qual è il tuo obiettivo finale? Cosa stai cercando di ottenere con quanto sopra? – Piskvor

risposta

26

Credo che la differenza sia causata da Date.parse che aggiunge UTC a una stringa ma non l'altra, vale a dire: / non è un separatore legale in Date.parse() che significa che UTC non viene aggiunto all'ora una volta che è analizzato. Poiché ' è un separatore legale, viene analizzato e quindi UTC viene aggiunto al tempo restituito.

Date.parse viene utilizzato dal metodo new Date() e la sua implementazione è specifica per il browser, sono sorpreso che questo genere di cose non si presentino più spesso.

La specifica per Date.parse dice:

la stringa può essere interpretata come un'ora locale, un tempo UTC, o un tempo in qualche altro fuso orario, a seconda del contenuto della stringa. La funzione tenta innanzitutto di analizzare il formato della stringa in base alle regole richiamate in Formato stringa data e ora (15.9.1.15). Se la stringa non è conforme a tale formato, la funzione può ricorrere a qualsiasi euristica specifica dell'implementazione o formati di data specifici dell'implementazione.

Quindi suggerirei sia l'aggiunta di un fuso orario manualmente prima si analizza, o scartare il tempo restituito da new Date(), tuttavia, che potrebbe portare a problemi intorno a mezzanotte, ecc La cosa più sicura sarebbe quella di vedere se è possibile ottenere la data in un formato più specifico da entrambi i sistemi, con informazioni sul fuso orario.

1

È a causa della globalizzazione. Il trattino (-) non è una notazione inglese (GMT). Javascript analizza la notazione. Prova a impostare la cultura e poi usa la notazione del trattino.

+2

In realtà sembra che '-' sia OK, ma non'/' –

12

Citando da V8 source code.

I commenti di questa funzione

bool DateParser::Parse(Vector<Char> str, 
         FixedArray* out, 
         UnicodeCache* unicode_cache) 

Accept ES5 ISO 8601 data-ora-stringhe o legacy date compatibile con Safari.

ES5 ISO 8601: date

[('-'|'+')yy]yyyy[-MM[-DD]][THH:mm[:ss[.sss]][Z|(+|-)hh:mm]] 

una stringa che corrisponde entrambi i formati (ad esempio 1970-01-01) saranno analizzato come una stringa ES5 data-ora - il che significa che sarà di default a UTC fuso orario. Questo è inevitabile se si segue la specifica ES5.

Il trattino (-) è la notazione corretta per Date.

Problemi correlati