2012-06-25 9 views
6

Ho testato il seguente codice in firefox scratchpad e ottenuto risultati interessanti?La nuova data di Javascript tratta in modo diverso rispetto allo stile di data differente?

var date=new Date("2012-05-12"); 
var date2 = new Date("05/12/2012"); 
date; 
/* 
Fri May 11 2012 17:00:00 GMT-0700 (Pacific Daylight Time) 
*/ 
date2; 
/* 
Sat May 12 2012 00:00:00 GMT-0700 (Pacific Daylight Time) 
*/ 

due date sono diverse. Apparentemente questo è dovuto al problema del fuso orario. Quello che voglio è il risultato della data2. Come posso fare in modo che il motore js consideri correttamente lo stile della data ISO?

+0

Rimuovere lo zero iniziale nel primo esempio. 'var date = new Date (" 2012-5-12 ");' – j08691

+0

@ j08691 che genera un errore "Data non valida", almeno in Firefox. – Pointy

+0

@Pointy - Buona cattura, ho provato in Chrome. – j08691

risposta

2

Penso che il problema è che la stringa "2012-05-12" è considerata una data ISO 8601, mentre "05/12/2012" è una data RFC 2822. Nel formato ISO, la mancanza di un fuso orario implica UTC. A mezzanotte del mattino del 12 maggio, in California (o ovunque tu sia) sono le 7 di sera della sera precedente.

La data RFC senza un fuso orario, però, viene analizzato sotto l'ipotesi che si desidera che il timestamp per la mezzanotte nella vostra locale fuso orario. (Beh, non necessariamente tua fuso orario, il fuso orario del computer su cui viene eseguito il tuo JavaScript :-)

Si può vedere la differenza se si passa a quelle stringhe Date.parse().

Il formato della data RFC può includere un fuso orario esplicito, ma il formato ISO non può. (Beh, si può, ma i browser non si presta attenzione, ea quanto pare IE non gestire quelli affatto.)

modificare — Ecco un semplice (muto; la verifica nessun errore) funzione che ti do una data da quella in 3 parti modulo ISO:

function isoDate(str) { 
    var rv = null; 
    str.replace(/^(\d\d\d\d)-(\d\d)-(\d\d)$/, function(_, yr, mn, dy) { 
    rv = new Date(parseInt(yr, 10), parseInt(mn, 10) - 1, parseInt(dy, 10)); 
    }); 
    return rv; 
} 
+0

Sì, quello che rispondi è in realtà ciò che sto pensando. Ma qualche soluzione ...? – NSF

+0

@NSF bene, è possibile analizzare autonomamente il formato di data ISO e quindi costruire esplicitamente la data. Se costruisci una data con valori numerici, dovrebbe assumere il fuso orario locale. – Pointy

0

dalla norma, con Date(), si può analizzare date ISO o date in un formato implementazione-dipendente, in modo implementazione-dipendente. Per ottenere qualcosa di più affidabile, utilizzare una libreria adatta in grado di analizzare le date in alcuni formati noti.

Problemi correlati