436 Stimmen

Liegt das Javascript-Datumsobjekt immer einen Tag daneben?

In meiner Java Script Anwendung habe ich das Datum in einem Format wie folgt gespeichert:

2011-09-24

Wenn ich nun versuche, mit dem obigen Wert ein neues Date-Objekt zu erstellen (damit ich das Datum in einem anderen Format abrufen kann), wird das Datum immer um einen Tag falsch angezeigt. Siehe unten:

var date = new Date("2011-09-24");
console.log(date);

Protokolle:

Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)

514voto

SoEzPz Punkte 13250

Es gibt mehrere verrückte Dinge, die mit einem JS passieren DATUM Objekt, das Zeichenketten konvertiert, zum Beispiel das folgende Datum, das Sie angegeben haben

Anmerkung: Die folgenden Beispiele können, müssen aber nicht sein EIN TAG FREI abhängig von IHR Zeitzone und aktuelle Zeit.

new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Wenn wir jedoch das Format der Zeichenkette umstellen auf Monat-Tag-Jahr ...

new Date("09-24-2011");
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Ein weiterer seltsamer Fall

new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.

new Date("2011/09/24"); // change from "-" to "/".
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Wir könnten die Bindestriche in Ihrem Datum leicht ändern "2011-09-24" wenn Sie ein neues Datum festlegen

new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Was wäre, wenn wir eine Datumszeichenfolge hätten wie "2011-09-24T00:00:00"

new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Jetzt ändern Bindestrich a Schrägstrich wie bisher; was passiert?

new Date("2011/09/24T00:00:00");
// => Invalid Date.

Ich muss normalerweise das Datumsformat verwalten 2011-09-24T00:00:00 Also mache ich Folgendes.

new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

UPDATE

Wenn Sie dem Date-Konstruktor separate Argumente übergeben, können Sie weitere nützliche Ausgaben erhalten, wie im Folgenden beschrieben

Anmerkung: Argumente können vom Typ Zahl oder String sein. Ich werde Beispiele mit gemischten Werten zeigen.

Ermittelt den ersten Monat und Tag eines bestimmten Jahres

new Date(2011, 0); // Normal behavior as months in this case are zero based.
// => Sat Jan 01 2011 00:00:00 GMT-0700 (MST)

Ermittelt den letzten Monat und Tag eines Jahres

new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day.
// => Sat Dec 31 2011 00:00:00 GMT-0700 (MST)

Beispiel für Zahlen- und String-Argumente. Beachten Sie, dass der Monat März ist, weil die Monate wieder auf Null basieren.

new Date(2011, "02"); 
// => Tue Mar 01 2011 00:00:00 GMT-0700 (MST)

Wenn wir dasselbe tun, aber mit einem Tag Null, erhalten wir etwas anderes.

new Date(2011, "02", 0); // Again the zero roles back from March to the last day of February.
// => Mon Feb 28 2011 00:00:00 GMT-0700 (MST)

Durch Hinzufügen eines Tages von Null zu einem beliebigen Jahr und Monat wird der letzte Tag des Vormonats ermittelt. Wenn Sie mit negativen Zahlen fortfahren, können Sie einen weiteren Tag zurückrollen

new Date(2011, "02", -1);
// => Sun Feb 27 2011 00:00:00 GMT-0700 (MST)

160voto

zzzzBov Punkte 166065

Beachten Sie, dass Eastern Daylight Time -4 hours und dass die Stunden an dem Tag, an dem du zurückkommst 20 .

20h + 4h = 24h

das ist Mitternacht des 24.09.2011. Das Datum war geparst in UTC (GMT), weil Sie eine reine Datumsangabe ohne Zeitzonenindikator gemacht haben. Hätten Sie stattdessen eine Zeichenkette mit Datum und Uhrzeit ohne Indikator angegeben ( new Date("2011-09-24T00:00:00") ), wäre sie in Ihrer lokalen Zeitzone geparst worden. (In der Vergangenheit gab es hier Unstimmigkeiten, nicht zuletzt, weil die Spezifikation mehr als einmal geändert wurde, aber moderne Browser sollten damit zurechtkommen; oder Sie können immer einen Zeitzonen-Indikator einfügen).

Sie erhalten das richtige Datum, Sie haben nur nicht die richtige Zeitzone angegeben.

Wenn Sie auf die Datumswerte zugreifen müssen, können Sie getUTCDate() o einer der anderen getUTC*() Funktionen :

var d,
  days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);

93voto

AaronLS Punkte 35857

Um das Datum zu normalisieren und den unerwünschten Versatz zu beseitigen (hier getestet: https://jsfiddle.net/7xp1xL5m/ ):

var doo = new Date("2011-09-24");
console.log(  new Date( doo.getTime() + Math.abs(doo.getTimezoneOffset()*60000) )  );
// Output: Sat Sep 24 2011 00:00:00 GMT-0400 (Eastern Daylight Time)

Dies erreicht auch das gleiche und Kredit zu @tpartee (getestet hier : https://jsfiddle.net/7xp1xL5m/1/ ):

var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 )  );

48voto

FishBasketGordo Punkte 22458

Ich glaube, dass es mit der Zeitzonenanpassung zu tun hat. Das Datum, das Sie erstellt haben, ist in GMT und die Standardzeit ist Mitternacht, aber Ihre Zeitzone ist EDT, also werden 4 Stunden abgezogen. Versuchen Sie dies zu überprüfen:

var doo = new Date("2011-09-25 EDT");

37voto

Kyle Shrader Punkte 833

Ich möchte nur hinzufügen, dass das Hinzufügen eines Leerzeichens am Ende der Zeichenfolge anscheinend UTC für die Erstellung verwendet.

new Date("2016-07-06")
> Tue Jul 05 2016 17:00:00 GMT-0700 (Pacific Daylight Time)

new Date("2016-07-06 ")
> Wed Jul 06 2016 00:00:00 GMT-0700 (Pacific Daylight Time)

Edit: Dies ist keine empfohlene Lösung, sondern nur eine alternative Antwort. Bitte verwenden Sie diesen Ansatz nicht, da es sehr unklar ist, was hier passiert. Es gibt eine Reihe von Möglichkeiten, wie jemand dieses Refactoring versehentlich einen Fehler verursachen könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X