2012-06-25 15 views
6

Ich habe den folgenden Code in Firefox Scratchpad getestet und interessantes Ergebnis bekommen?Javascript neues Datum behandelt unterschiedlich in Bezug auf verschiedene Datumsformat?

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) 
*/ 

Zwei Daten sind unterschiedlich. Anscheinend ist dies auf das Zeitzonenproblem zurückzuführen. Was ich will, ist das Ergebnis von date2. Wie kann ich sicherstellen, dass die js-Engine den ISO-Datums-Style korrekt behandelt?

+0

Entfernen Sie die führende Null im ersten Beispiel. 'var date = new Datum (" 2012-5-12 ");' – j08691

+0

@ j08691, was zumindest in Firefox zu einem Fehler "ungültiges Datum" führt. – Pointy

+0

@ Pointy - Guter Fang, habe ich in Chrome getestet. – j08691

Antwort

2

Ich denke, das Problem ist, dass die Zeichenfolge "2012-05-12" ist ein ISO 8601 Datum genommen, während "05/12/2012" ist ein RFC 2822 Datum. Im ISO-Format bedeutet das Fehlen einer Zeitzone UTC. Um Mitternacht am Morgen des 12. Mai, in Kalifornien (oder wo auch immer du bist) ist es am Abend zuvor um 19 Uhr.

Das RFC-Datum ohne eine Zeitzone wird jedoch unter der Annahme analysiert, dass Sie den Zeitstempel für Mitternacht in Ihrer lokalen Zeitzone haben möchten. (Na ja, nicht unbedingt Ihre Zeitzone, die Zeitzone des Computers, auf dem sie JavaScript läuft :-)

Sie können den Unterschied sehen, wenn Sie diese Zeichenfolgen zu Date.parse() passieren.

Das RFC-Datumsformat kann eine explizite Zeitzone enthalten, das ISO-Format jedoch nicht. (Nun, es kann aber Browsern nicht aufpasst, und anscheinend nicht IE nicht jene überhaupt handhaben.)

bearbeiten — hier ist ein einfaches (dumb, keine Fehlerprüfung) Funktion, die Sie geben ISO bildet ein Zeitpunkt von dieser 3-teiligen:

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

Ja, was Sie antworten, ist eigentlich, was ich denke. Aber irgendwelche Lösungen ...? – NSF

+0

@NSF Nun könnten Sie das ISO-Datumsformat selbst analysieren und dann das Datum explizit konstruieren. Wenn Sie ein Datum mit einem numerischen Wert erstellen, sollte es die lokale Zeitzone annehmen. – Pointy

0

Durch den Standard, mit Date() können Sie ISO-Daten oder Termine in einem implementierungsabhängigen Format in einer umsetzungsabhängigen Weise analysieren. Um etwas zuverlässiger zu bekommen, verwenden Sie eine geeignete Bibliothek, die Daten in einigen bekannten Formaten analysieren kann.

Verwandte Themen