2012-10-31 7 views
5

Warum diese zwei Termine sind differents:Unterschied bei der Initialisierung von zwei Daten in Javascript

var date1 = new Date(); 
date1.setFullYear(2012); // year (four digits) 
date1.setMonth(10); // month (from 0-11) 
date1.setDate(1); // day of the month (from 1-31) 

var date2 = new Date(2012, 10, 1, 0, 0, 0, 0); 

Ergebnis:

Date 1 : Sat Dec 01 2012 14:56:16 GMT+0100 
Date 2 : Thu Nov 01 2012 00:00:00 GMT+0100 

Erwägung, dass diese zwei Daten sind gleich:

var date3 = new Date(); 
date3.setFullYear(2012); // year (four digits) 
date3.setMonth(9); // month (from 0-11) 
date3.setDate(1); // day of the month (from 1-31) 

var date4 = new Date(2012, 9, 1, 0, 0, 0, 0); 

Ergebnis:

Date 3 : Mon Oct 01 2012 14:56:16 GMT+0200 
Date 4 : Mon Oct 01 2012 00:00:00 GMT+0200 

Eine andere Frage ist, warum tun date1.setMonth(10) gibt ein Datum im Dezember (sollte November sein).

+0

Ist das wirklich Ihr * exakter * Code? –

+0

@JonSkeet Das zentrale Problem ist reproduzierbar nur durch Kopieren seines ersten Codeblocks. –

Antwort

10

Endlich verstanden. new Date() setzt das Datum auf aktuelles Datum und Uhrzeit. Mit anderen Worten, am 31. Oktober (zum Zeitpunkt dieses Schreibens).

Wenn Sie dann versuchen, den Monat auf November einzustellen, was ist zu tun? Der November hat nur 30 Tage ... also wickelt er ihn bis Dezember ab.

Wenn Sie die Reihenfolge ändern, damit Sie den Tag-of-Monats vor der Monat eingestellt, funktioniert es:

var date1 = new Date(); 
date1.setFullYear(2012); // year (four digits) 
date1.setDate(1); // day of the month (from 1-31) 
date1.setMonth(10); // month (from 0-11) 

Oder wie jbabey Antwort impliziert:

var date1 = new Date(); 
date1.setFullYear(2012); // year (four digits) 
date1.setMonth(10, 1); // month (from 0-11) and day (1-31) 

The documentation ist nicht schrecklich klar, aber es ist mindestens suggestiv:

Wenn ein von Ihnen angegebener Parameter außerhalb des erwarteten Bereichs liegt, versucht setMonth, die Datumsinformationen im Date-Objekt entsprechend zu aktualisieren. Wenn Sie beispielsweise 15 für den Monatswert verwenden, wird das Jahr um 1 erhöht (Jahr + 1), und 3 wird für den Monat verwendet.

(„Dementsprechend“ ist bei weitem nicht genau, aber es bedeutet, dass die Umsetzung zumindest wohl richtig ist ...)

+0

+1 das war ein lustiges Puzzle: D – jbabey

+0

Danke @ Jon Skeet für Ihre Erklärungen und den Verweis auf die Dokumentation. Ich verstehe was passiert! Die dritte Lösung ist in meiner Frage 'neues Datum (2012, 10, 1, 0, 0, 0, 0)' –

0

Sie erstellen eine Var mit dem aktuellen Datum (new Date()) und dann ändern Sie einige seiner Schlüssel (Jahr, Monat und Tag).

Auf der anderen Seite bedeutet new Date(2012, 10, 1, 0, 0, 0, 0) bedeutet "Erstellen eines Datumsobjekts mit diesen genauen Werten".

Und deshalb sind Ihre Date-Objekte nicht gleich.

+1

Wenn Sie sich nur auf den Zeitteil beziehen, erklärt dies nicht, warum der Versuch, den Monat auf November zu setzen, ihn tatsächlich auf Dezember setzt. –

3

setMonth einen zweiten Parameter akzeptiert:

Wenn Sie nicht angeben Der Parameter dayValue verwendet den Wert, der von der Methode getDate zurückgegeben wird.

Wenn Sie den Monat 10 (November) gesetzt ist, packt er den aktuellen Tageswert (31) und setzt das wie am ersten Tag.Da es im November nur 30 Tage gibt, rollt man bis zum 1. Dezember.

Verwandte Themen