new Date() gesetzt, bis zum 31. Dezember 2014, sagt 1. Dezember statt
Ich versuche zu konvertieren einen string in ein Date-Objekt, und es funktioniert für alle Tage, außer für Dezember 31st, wo vom Objekt sagt 1. Dezember statt am 31. Ich habe keine Ahnung, warum. Hier ist mein JavaScript
code:
var dt = new Date();
dt.setDate("31");
dt.setMonth("11");
dt.setFullYear("2014");
aber mein Wert der variable ist:
Mon Dec 01 2014 11:48:08 GMT+0100 (Paris, Madrid)
Wenn ich das gleiche tun für andere Datum, mein Objekt zurückgibt, um den entsprechenden Wert. Haben Sie eine Idee, was ich falsch gemacht habe?
- Sie sind gedacht, um pass zahlen setMonth etc, keine Zeichenfolgen.
- ganze zahlen scheinen zu produzieren, die den gleichen Wert.
- Können Sie dies replizieren in einem plunkr?
- ändern Sie die Reihenfolge der Einstellung der Werte!
- Sie können die
Date
Konstruktor-Parameter direkt:new Date(2014, 11, 31)
- btw. ist das nicht der 11ten Monat November?
- Nein. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
- Warum fordern Sie
setXY
auf eine variable mit der aktuellen datetime-eh? Wenn Sie ein neues datetime-Objekt verwenden, sollten Sienew Date(Date.UTC(2014, 11, 31))
- HINWEIS: das Ergebnis in diesem Beispiel abweichen, je nach dem aktuellen Datum. Beispiel-code erzeugen wird, die RICHTIGEN Ergebnisse, wenn der aktuelle Monat ist der Januar, März, ..., Oktober, Dezember.
- Es gibt nur 30 Tagen im November (Monat 11) und einen Tag nach vorne würde 1. Dezember. Vielleicht irgendwo auf der Linie der Zeit vermischt, denn die null-Indizierung für Monate?
- Nein, das Datum ist Durcheinander, da der Monat jetzt 30 Tage hat.
- C struct tm.tm_mon Feld repräsentiert den Monat als "Monate seit Januar", so die Nummerierung bei null, und wir alle Leben mit, dass die ursprüngliche Sünde seit.
- ah, macht Sinn.
Du musst angemeldet sein, um einen Kommentar abzugeben.
: (nicht sicher für Monate mit weniger als 31 Tagen)setMonth
sollte vorsetDate
Sowie
setMonth
's zweiter parameter kann auch verwendet werden, um das Datum einzustellen.Wenn keine Argumente für den Konstruktor verwenden, wird das aktuelle Datum und die Zeit nach system-Einstellungen.
So, mit
setMonth
undsetDate
getrennt würde noch ein unerwartetes Ergebnis.Wenn die Werte eingestellt sind größer als Ihre logische Reihe, wird der Wert auto , angepasst an die benachbarten Wert.
Beispielsweise, wenn heute ist
2014-09-30
, dannUm dies zu vermeiden, stellen Sie die Werte mit dem Konstruktor direkt.
setMonth
existierte.dt
nach jedem Methodenaufruf:var dt = new Date(); console.log(dt); dt.setDate("31"); console.log(dt); dt.setMonth("11"); console.log(dt); dt.setFullYear("2014"); console.log(dt);
. Sie werden sehen, dass @FailingBullets richtig ist (zumindest bei den aktuellen Monat des Datums nach der Uhr Ihres Computers hat 30 Tage, September tut).SetMonth
mit nur einem Monat-parameter Probleme haben, wenn das aktuelle Datum der 31. und Sie versuchen, einem Monat, der weniger Tage hat? Ich würde sagen, der Konstruktornew Date(...)
mit dem gewünschten Datum für einen parameter ist stark bevorzugt.Die Sache ist, wenn Sie einen Tag gesetzt, Erstens, du bist noch im Laufenden Monat, also September. September hat nur 30 Tage so:
dt.setDate(dt.getDate() + 7)
. Wenn heute Nov 29, es wird konvertieren "Nov 36" bis "Dec-6". Eine separate DateAdd-Funktion könnte besser gewesen, aber es kann nicht wirklich verändert werden an dieser Stelle...Ist es denn das erste, was Sie tun, ist
Diese setzt das aktuelle Datum bis zum 31. Der aktuelle Monat ist der September hat 30 Tage, also ist es wrappen es Runde.
Wenn Sie drucken Sie das Datum nach diesem Zeitpunkt, es würde sagen, der 1. Oktober.
Vorausgesetzt Ihre Absicht ist, um Jahr, Monat und Tag gleichzeitig könnten Sie die mehr date-Konstruktor:
So, würden Sie schreiben:
Als bereits etabliert ist, ist die Einstellung ein Teil des Datums, zu einer Zeit führen kann overflows:
Zudem, Einstellung Monat vor dem Datum, das kann noch zu unerwarteten überlauf (Antworten, empfehlen, änderung der Reihenfolge von Methoden falsch sind):
Dem warum des Verhaltens und wie man es vermeiden, wurde ausführlich erläutert.
Aber der eigentliche Fehler in deinem code ist, dass sollten Sie nicht verwenden die default-Konstruktor: new Date(). Ihr code wird Ergebnis in ein Datum im Dez. 13 mit der aktuellen Zeit. Ich bezweifle, dass dies ist, was Sie wollen. Verwenden Sie die Date-Konstruktor, Jahr, Monat und Tag als Parameter.
Den Antworten deutlich gemacht, dass die richtige Reihenfolge für die Einstellung des Datums ist:
Ich möchte nur darauf hinweisen, dass es auch wichtig, um das Jahr einzustellen auf den ersten, weil der 29. Februar in leapyears.
Pass " - Wert als integer, nicht string.. wird es wieder richtige u-Wert..
Update -
obige Beschreibung ist nicht korrekt.. die Hauptsache war das Sie benötigen, um diese drei Zeilen in der richtigen Reihenfolge.. Auch Nachdem ich das korrigiert die Reihenfolge habe ich vergessen zu korrigieren, die Beschreibung.. 😛