2015-04-17 5 views
18

Der Test:Wie erklärt man den Unterschied im Date-Konstruktor?

var d1 = new Date("2000-04-22T00:00:00+00:00"); 
var d2 = new Date(2000, 4, 22, 0, 0, 0, 0); 
console.log("d1 = " + d1.getTime()); 
console.log("d2 = " + d2.getTime()); 

Das Ergebnis:

d1 = 956361600000 
d2 = 958946400000 

Ich denke, der Unterschied von Zeitzonen kommt, aber ich verstehe es nicht!

Welche magischen Sachen erzeugen diesen Unterschied?

+2

, die wegen Ihrer Zeitzone – epascarello

+2

Verwenden 'new Date wäre (Date.UTC (2000, 4, 22, 0, 0, 0, 0)); 'um das erwartete Ergebnis zu erhalten. – Bergi

+0

Das löst das UTC-Problem, mit dem richtigen Monatsindex wird es 'neues Datum (Date.UTC (2000, 3, 22, 0, 0, 0, 0));' und es funktioniert! –

Antwort

12

Das größte Problem ist, dass Monate in Javascript 0 indexiert werden, beim Erstellen Ihrer zweiten Datumsinstanz die 4 bedeutet Mai. Außerdem enthält Ihre Zeichenfolge +00: 00 für Zeitzonenzwecke, also UTC/GMT. Ihre Sekunde enthält keine Zeitzoneninformationen, daher ist es die lokale Zeitzone.

Wenn Sie ein UTC-Datum zu ähnlich aufgebaut wollen, wie Sie es hatten, können Sie anrufen:

var d2 = new Date(Date.UTC(2000, 3, 22, 0, 0, 0, 0)); 
+0

'UTC' ist kein Konstruktor – Bergi

+0

Danke, behoben, vergessen, in Datum zu wickeln. – JBzd

19

Ihre ISO-Datumszeichenfolge hat eine explizite UTC-Zeitzone und wird daher als UTC interpretiert. Das zweite Datum wird mit numerischen Parametern für die Datumsteile erstellt, und das bedeutet, dass das Erstellen eines Datums implizit die lokale Zeitzone verwendet.

Beachten Sie auch, dass die "4" in der Datumszeichenkette "April" bedeutet, während die "4" im zweiten Konstruktor "Mai" bedeutet: Bei der Verwendung des numerischen Konstruktors werden die Monate beginnend mit Null nummeriert.

+1

Wir treffen uns wieder und du bist * immer noch * super. –

4

Ich denke, das ist am besten described in the documentation:

Hinweis: Wo Datum als Konstruktor mit mehr als einem Argument aufgerufen wird, werden die specifed Argumente Ortszeit darstellen. Wenn UTC gewünscht wird, verwenden Sie ein neues Date (Date.UTC (...)) mit denselben Argumenten.

Mit anderen Worten, wenn Sie den Zeichenfolgenkonstruktor verwenden, erhalten Sie UTC. Wenn Sie eine mit dem Konstruktor erstellen, erhalten Sie Ihr normales Gebietsschema.

Verwandte Themen