Ist das Javascript-Datumsobjekt immer einen Tag frei?

238

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

2011-09-24

Wenn ich jetzt versuche, mit dem obigen Wert ein neues Datumsobjekt zu erstellen (damit ich das Datum in einem anderen Format abrufen kann), wird das Datum immer einen freien Tag zurückgegeben. Siehe unten:

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

Protokolle:

Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
Levi
quelle
11
Die Date-Klasse von Javascript repräsentiert kein Datum, sondern einen Zeitstempel (wie in Java). Um es zu einem Datum zu machen, wird eine Zeitzone verwendet, und das ist die Ursache für Ihr Problem. Es analysiert es mit der GMT / UTC-Zeitzone (24. September 2011, 00 : 00 UTC) und gibt es dann mit einer anderen Zeitzone von 4 Stunden aus (23. September 2011, 20 : 00 GMT-0400).
Codo
2
Ich bekomme "ungültiges Datum". Ersetzen Sie die Zeichen '-' durch Zeichen '/' und versuchen Sie es erneut. Oder teilen Sie das Datum in seine Bits auf und stellen Sie die Komponenten einzeln ein (wenn Sie dies tun, subtrahieren Sie 1 von der Monatszahl).
RobG
@ Codo - ja, gute Antwort. Es gilt ECMA-262 15.9.1.15. Das OP sollte "2011-09-24T20: 00: 00-04: 00" oder ähnliches verwenden.
RobG
1
Ich habe festgestellt, dass das Format "24. September 2011" das richtige Datum zurückgibt. Eine Erklärung finden Sie hier: stackoverflow.com/questions/2587345/javascript-date-parse
christurnerio

Antworten:

98

Beachten Sie, dass die östliche Sommerzeit ist -4 hoursund dass die Stunden an dem Datum, an dem Sie zurückkommen, sind 20.

20h + 4h = 24h

Das ist Mitternacht des 24.09.2011. Das Datum wurde in UTC (GMT) analysiert, da Sie eine Nur-Datum-Zeichenfolge ohne Zeitzonenanzeige angegeben haben. Wenn Sie stattdessen eine Datums- / Zeitzeichenfolge ohne Indikator angegeben hätten ( new Date("2011-09-24T00:00:00")), wäre diese in Ihrer lokalen Zeitzone analysiert worden. (In der Vergangenheit gab es dort Inkonsistenzen, nicht zuletzt, weil sich die Spezifikation mehr als einmal geändert hat, aber moderne Browser sollten in Ordnung sein; oder Sie können immer eine Zeitzonenanzeige einfügen.)

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

Wenn Sie die Datumswerte zugreifen müssen, können Sie getUTCDate()oder eine 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()]);
zzzzBov
quelle
24
Wie geben Sie "die richtige Zeitzone an"? Der Datumskonstruktor interpretiert die Datumszeichenfolge immer als UTC, passt sie dann jedoch an die Zeitzone an. Ich kann sogar "neues Datum" ("2012-01-02 EDT") erstellen und es immer noch auf den vorherigen Tag verschieben, da der Offset für die Sommerzeit angewendet wird. Dies ist nicht sinnvoll, da dies das Datum gemäß dem Datum ist Wenden Sie die aktuelle lokale Zeitzone von EDT an und wenden Sie dann keinen zusätzlichen Versatz an. Ich habe ihm gesagt, dass die Zeitzone EDT ist, aber es wird immer noch ein zusätzlicher Versatz angewendet, um sie eines Tages zurückzusetzen.
AaronLS
1
@AaronLS EDTist die Sommerzeit (auch als Sommerzeit bezeichnet) und ESTdie Zeitzone, die im Januar gilt.
zzzzBov
1
Es wäre das, was ich tun möchte, wenn ich es nur als UTC aus einer Zeichenfolge erstelle. Deshalb habe ich gefragt, wie Sie die richtige Zeitzone angeben. in Bezug darauf, wo Sie angegeben haben "Sie haben einfach nie die richtige Zeitzone angegeben." Wenn ich das tue new Date('2012-01-01 GMT'), wird immer noch ein Versatz angewendet, da dieser in die lokale Datums- und Uhrzeit des Benutzers konvertiert wird.
AaronLS
7
@AaronLS: Wenn Sie gezwungen sind, die get*Methoden zu verwenden und das korrekte Datum / die korrekte Uhrzeit einschließlich des unbekannten Zeitzonenversatzes zurückgeben müssen, fügen Sie einfach den unbekannten Zeitzonenversatz hinzu: d = new Date('2013-01-08 GMT'); d.setMinutes(d.getMinutes() + d.getTimezoneOffset());Dadurch wird das Datum zum Gebietsschema des Benutzers normalisiert, sodass die .get*Methoden zurückkehren der erwartete Wert. Die .getUTC*Methoden sind dann falsch, seien Sie also vorsichtig.
zzzzBov
1
Es gibt einen Unterschied zwischen der Definition des Verhaltens zur Bereitstellung einer Referenz und der Verwendung als Escape, wenn die Implementierer etwas nicht korrekt implementiert haben. Und es ist nicht dieselbe Darstellung, wenn die Daten nicht den Erwartungen entsprechen.
Dissident Rage
252

Es gibt einige verrückte Dinge, die mit einem JS DATE- Objekt passieren , das Zeichenfolgen konvertiert, z. B. das folgende von Ihnen angegebene Datum

Hinweis: Die folgenden Beispiele können abhängig von IHRER Zeitzone und der aktuellen Zeit EINEN TAG AUS sein oder nicht .

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 Zeichenfolgenformat auf Monat-Tag-Jahr umstellen ...

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

Noch eine seltsame

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 leicht Bindestriche in Ihrem Datum "2011-09-24" ändern, 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 wie "2011-09-24T00: 00: 00" hätten?

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

Ändern Sie nun den Bindestrich wie zuvor in Schrägstrich . was geschieht?

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

Normalerweise muss ich das Datumsformat 2011-09-24T00: 00: 00 verwalten, damit ich dies tue.

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

AKTUALISIEREN

Wenn Sie dem Date-Konstruktor separate Argumente bereitstellen, können Sie andere nützliche Ausgaben erhalten, wie unten beschrieben

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

Holen Sie sich 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)

Holen Sie sich 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 Zeichenfolgenargumente. Beachten Sie, dass der Monat März ist, da 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 von Null, bekommen 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)

Wenn Sie einem Argument für Jahr und Monat einen Tag von Null hinzufügen, wird der letzte Tag des Vormonats angezeigt. Wenn Sie mit negativen Zahlen fortfahren, können Sie einen weiteren Tag zurücksetzen

new Date(2011, "02", -1);
=> // Sun Feb 27 2011 00:00:00 GMT-0700 (MST)
SoEzPz
quelle
12
Das hat mir tatsächlich am besten geholfen. Ich habe gerade das .replace (/ - / g, '\ /'). Replace (/ T. + /, '') Am Ende meiner Daten hinzugefügt, als ich ein neues Datum festgelegt habe. Super einfach!
Devin Prejean
63
Wow - Javascript ist schrecklich inkonsistent.
Spargel
2
Die Aufrufe von .replace () haben heute Abend zur Not wirklich geholfen.
Nichtgebrauch
2
Ja, ich habe das alles getestet und es ist wirklich seltsam.
Chintan Adatiya
26
All dies ist auf das Verhalten der zugrunde liegenden Date.parse () zurückzuführen, die versucht, ISO 8601 zu folgen. Wenn die Datumszeichenfolge dem Format JJJJ-MM-TT folgt, wird angenommen, dass sie ISO 8601 mit impliziter UTC 00:00 ist. Wenn die Zeichenfolge vom Format abweicht (z. B. MM-TT-JJJJ oder Schrägstrich anstelle von Bindestrich), wird auf den loseren Parser gemäß RFC 2822 zurückgegriffen, der die Ortszeit verwendet, wenn die Zeitzone fehlt. Zugegeben, das alles wird für eine durchschnittliche Person ziemlich geheimnisvoll sein.
Mizstik
71

So normalisieren Sie das Datum und beseitigen den unerwünschten Versatz (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 bewirkt auch dasselbe und schreibt @tpartee zu (hier getestet: https://jsfiddle.net/7xp1xL5m/1/ ):

var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 )  );
AaronLS
quelle
Das hat es für mich getan - ich musste mit Daten aus einer API arbeiten und sie dann sortieren / vergleichen, sodass das Hinzufügen des Zeitzonenversatzes am besten funktioniert.
Chakeda
Dies funktionierte für mich, außer dass ich das timeZoneOffset subtrahieren und nicht hinzufügen musste
ErikAGriffin
@ErikAGriffin Befinden Sie sich in einer positiven Zeitzone, IE GMT + 0X00 anstelle von GMT-0X00?
AaronLS
Ich habe etwas Ähnliches gemacht:doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
Dissident Rage
2
@ AaronLS Du warst auf dem richtigen Weg, aber etwas falsch logisch. Um den TZ-Offset zu kompensieren, lautet die korrekte Logik: console.log (neues Datum (doo.getTime () - doo.getTimezoneOffset () * -60000)); - Das Vorzeichen des Versatzes ist wichtig und kann nicht entfernt werden. Sie benötigen jedoch auch das inverse Vorzeichen zur Korrektur, sodass wir den Versatz mit -60000 multiplizieren, damit das inverse Vorzeichen angewendet wird.
Tpartee
28

Wenn Sie die Stunde 0 eines Datums in der lokalen Zeitzone erhalten möchten, übergeben Sie die einzelnen Datumsteile an den DateKonstruktor.

new Date(2011,08,24); // month value is 0 based, others are 1 based.
lincolnk
quelle
26

Ich möchte nur hinzufügen, dass das Hinzufügen eines Leerzeichens am Ende der Zeichenfolge 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)

Bearbeiten: Dies ist keine empfohlene Lösung, sondern nur eine alternative Antwort. Bitte verwenden Sie diesen Ansatz nicht, da sehr unklar ist, was passiert. Es gibt eine Reihe von Möglichkeiten, wie jemand dies versehentlich umgestalten und einen Fehler verursachen kann.

Kyle Shrader
quelle
Für das Beispiel mit dem Leerzeichen am Ende gibt die Konsole "Ungültiges Datum = $ 2" zurück
Brian Risk
1
funktioniert sehr gut! neues Datum (data.Date + "") .toLocaleDateString ("en-US")
Nakres
Um fair zu sein, war dies nur eine alternative Antwort und keine empfohlene Lösung.
Kyle Shrader
25

Ich glaube, dass es mit der Zeitzonenanpassung zu tun hat. Das von Ihnen erstellte Datum ist in GMT und die Standardzeit ist Mitternacht, aber Ihre Zeitzone ist EDT, sodass 4 Stunden abgezogen werden. Versuchen Sie dies, um Folgendes zu überprüfen:

var doo = new Date("2011-09-25 EDT");
FishBasketGordo
quelle
3
Dies ist die beste Antwort hier. + 1 Million für die Verwendung der integrierten Zeitzonenlokalisierungszeichenfolgen anstelle der programmgesteuerten Konvertierung.
Blearn
2
Dieser hilft. Es funktioniert folgendermaßen: $ scope.dat = neues Datum (Datumsring + 'EDT'). Beachten Sie den Unterschied zwischen EDT und EST: Link
Weihui Guo
Ich weiß nicht, was hinter den Kulissen passiert, aber es funktioniert perfekt.
the_haystacker
Ich würde sagen, dies ist die einfachste Antwort und weniger Code-Neuformatierung.
Michael
Danke, ich halte den besten Weg für mich.
Janderson Constantino
11

Ihr Problem betrifft speziell die Zeitzone. Teil beachten GMT-0400- das heißt, Sie sind 4 Stunden hinter GMT. Wenn Sie dem angezeigten Datum / der angezeigten Uhrzeit 4 Stunden hinzufügen, erhalten Sie genau Mitternacht 2011/09/24. Verwenden Sie toUTCString()stattdessen die Methode, um die GMT-Zeichenfolge abzurufen:

var doo = new Date("2011-09-24");
console.log(doo.toUTCString());
Aleks G.
quelle
6

Dies ist wahrscheinlich keine gute Antwort, aber ich möchte nur meine Erfahrungen mit diesem Problem teilen.

Meine App verwendet global utc date mit dem Format 'JJJJ-MM-TT', während das von mir verwendete Datepicker-Plugin nur js date akzeptiert, fällt es mir schwer, sowohl utc als auch js zu berücksichtigen. Wenn ich also ein mit 'JJJJ-MM-TT' formatiertes Datum an meinen Datepicker übergeben möchte, konvertiere ich es zuerst mit moment.js oder was auch immer Sie möchten in das Format 'MM / TT / JJJJ', und das Datum wird jetzt auf dem Datepicker angezeigt richtig. Für dein Beispiel

var d = new Date('2011-09-24'); // d will be 'Fri Sep 23 2011 20:00:00 GMT-0400 (EDT)' for my lacale
var d1 = new Date('09/24/2011'); // d1 will be 'Sat Sep 24 2011 00:00:00 GMT-0400 (EDT)' for my lacale

Anscheinend ist d1 das, was ich will. Hoffe, das wäre für einige Leute hilfreich.

Jie Zhang
quelle
Nur die Formate zu wechseln, wie Sie es getan haben, hat bei mir genauso funktioniert. So seltsam.
JAC
5

Dies durch mich für eine Schleife, +1 auf zzzBovs Antwort. Hier ist eine vollständige Konvertierung eines Datums, das mit den UTC-Methoden für mich funktioniert hat:

//myMeeting.MeetingDate = '2015-01-30T00:00:00'

var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off!

myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date!
cmartin
quelle
4

Es bedeutet 2011-09-24 00:00:00 GMT, und da Sie gerade dabei sind GMT -4, wird es 20:00der vorherige Tag sein.

Persönlich verstehe ich 2011-09-24 02:00:00, weil ich bei wohne GMT +2.

pimvdb
quelle
3

Obwohl im Fall des OP die Zeitzone EDT ist, gibt es keine Garantie dafür, dass sich der Benutzer, der Ihr Skript ausführt, in der EDT-Zeitzone befindet, sodass die Hardcodierung des Offsets nicht unbedingt funktioniert. Die gefundene Lösung teilt die Datumszeichenfolge und verwendet die separaten Werte im Datumskonstruktor.

var dateString = "2011-09-24";
var dateParts = dateString.split("-");
var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);

Beachten Sie, dass Sie ein weiteres Stück JS-Verrücktheit berücksichtigen müssen: Der Monat basiert auf Null.

Brian Risk
quelle
2

Ich bin genau auf dieses Problem gestoßen, als mein Kunde in der Atlantic Standard Time war. Der Datumswert, den der Client abgerufen hat, war "2018-11-23", und als der Code ihn an new Date("2018-11-23")die Ausgabe für den Client weitergab, war er für den vorherigen Tag. Ich habe eine Dienstprogrammfunktion wie im Snippet gezeigt erstellt, die das Datum normalisiert und dem Client das erwartete Datum gibt.

date.setMinutes(date.getMinutes() + date.getTimezoneOffset());

var normalizeDate = function(date) {
  date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
  return date;
};

var date = new Date("2018-11-23");

document.getElementById("default").textContent = date;
document.getElementById("normalized").textContent = normalizeDate(date);
<h2>Calling new Date("2018-11-23")</h2>
<div>
  <label><b>Default</b> : </label>
  <span id="default"></span>
</div>
<hr>
<div>
  <label><b>Normalized</b> : </label>
  <span id="normalized"></span>
</div>

Gabriel Gates
quelle
2

Wenn Sie nur sicherstellen möchten, dass die einzelnen Teile des Datums für Anzeigezwecke gleich bleiben, * scheint dies zu funktionieren, auch wenn ich meine Zeitzone ändere:

var doo = new Date("2011-09-24 00:00:00")

Fügen Sie einfach die Nullen hinzu.

In meinem Code mache ich das:

let dateForDisplayToUser = 
  new Date( `${YYYYMMDDdateStringSeparatedByHyphensFromAPI} 00:00:00` )
  .toLocaleDateString( 
    'en-GB', 
    { day: 'numeric', month: 'short', year: 'numeric' }
  )

Und ich schalte meine Zeitzone auf meinem Computer um und das Datum bleibt das gleiche wie die Datumszeichenfolge JJJJ-MM-TT, die ich von der API erhalte.

Aber fehlt mir etwas / ist das eine schlechte Idee?

* Zumindest in Chrom. Dies funktioniert nicht in Safari! zum jetzigen Zeitpunkt

Timothy Mitchell
quelle
Wenn Sie dies tun .toISOString(), geht es 1 Tag zurück.
vivek_23
new Date('2019/11/18 05:30:00').toISOString();arbeitete für mich
vivek_23
1

Der beste Weg, dies zu handhaben, ohne weitere Konvertierungsmethoden zu verwenden,

 var mydate='2016,3,3';
 var utcDate = Date.parse(mydate);
 console.log(" You're getting back are 20.  20h + 4h = 24h :: "+utcDate);

Fügen Sie jetzt einfach GMT zu Ihrem Datum hinzu oder Sie können es anhängen.

 var  mydateNew='2016,3,3'+ 'GMT';
 var utcDateNew = Date.parse(mydateNew);
 console.log("the right time that you want:"+utcDateNew)

Live: https://jsfiddle.net/gajender/2kop9vrk/1/

Gajender Singh
quelle
1

Ich stand vor einem solchen Problem. Aber mein Problem war der Versatz beim Abrufen des Datums aus der Datenbank.

Dies erfolgt in der Datenbank und im UTC-Format.

2019-03-29 19: 00: 00.0000000 +00: 00

Wenn ich also aus der Datenbank komme und das Datum überprüfe, wird ein Offset hinzugefügt und an Javascript zurückgesendet.

Geben Sie hier die Bildbeschreibung ein

Es wird +05: 00 hinzugefügt, da dies meine Server-Zeitzone ist. Mein Kunde befindet sich in einer anderen Zeitzone +07: 00.

2019-03-28T19: 00: 00 + 05: 00 // das bekomme ich in javascript.

Hier ist meine Lösung, was ich mit diesem Problem mache.

var dates = price.deliveryDate.split(/-|T|:/);
var expDate = new Date(dates[0], dates[1] - 1, dates[2], dates[3], dates[4]);
var expirationDate = new Date(expDate);

Wenn also das Datum vom Server kommt und den Server-Offset hat, teile ich das Datum auf und entferne den Server-Offset und konvertiere dann zum Datum. Es löst mein Problem.

Uxmaan Ali
quelle
1

Wenn Sie hierfür eine einfache Lösung benötigen, siehe:

new Date('1993-01-20'.split('-')); 

Geben Sie hier die Bildbeschreibung ein

Sebastiao Marcos
quelle
0

Sie verwenden das ISO-Datumszeichenfolgenformat, das laut dieser Seite bewirkt, dass das Datum mithilfe der UTC-Zeitzone erstellt wird:

Hinweis: Das Parsen von Datumszeichenfolgen mit dem Date-Konstruktor (und Date.parse, sie sind gleichwertig) wird aufgrund von Unterschieden und Inkonsistenzen im Browser dringend empfohlen. Die Unterstützung von Zeichenfolgen im RFC 2822-Format erfolgt nur gemäß Konvention. Die Unterstützung für ISO 8601-Formate unterscheidet sich darin, dass Nur-Datum-Zeichenfolgen (z. B. "1970-01-01") als UTC und nicht als lokal behandelt werden.

Wenn Sie den Text anders formatieren, z. B. "Jan 01 1970"(zumindest auf meinem Computer), wird Ihre lokale Zeitzone verwendet.

Paul Wintz
quelle
0

Ich versuche, meine 2 Cent zu diesem Thread hinzuzufügen (Ausarbeitung der Antwort von @ paul-wintz).

Mir scheint, wenn der Datumskonstruktor eine Zeichenfolge empfängt, die dem ersten Teil des ISO 8601-Formats (Datumsteil) entspricht, führt er eine genaue Datumskonvertierung in der UTC-Zeitzone mit der Zeit 0 durch. Wenn dieses Datum in die Ortszeit konvertiert wird, kann es zu einer Datumsverschiebung kommen, wenn Mitternacht UTC ein früheres Datum in der Ortszeitzone ist.

new Date('2020-05-07')
Wed May 06 2020 20:00:00 GMT-0400 (Eastern Daylight Time)

Wenn die Datumszeichenfolge in einem anderen "loseren" Format vorliegt (verwendet "/" oder Datum / Monat nicht mit Null aufgefüllt ist), wird das Datum in der lokalen Zeitzone erstellt, sodass kein Problem mit der Datumsverschiebung auftritt.

new Date('2020/05/07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-05-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)

Wie oben erwähnt, besteht eine schnelle Lösung darin, "-" durch "/" in Ihrer ISO-formatierten Nur-Datum-Zeichenfolge zu ersetzen.

new Date('2020-05-07'.replace('-','/'))
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
Florin D.
quelle
0

Beim Speichern yyyy-mm-ddim MySQL-Datumsformat müssen Sie Folgendes tun:

const newDate = new Date( yourDate.getTime() + Math.abs(yourDate.getTimezoneOffset()*60000) );
console.log(newDate.toJSON().slice(0, 10)); // yyyy-mm-dd
Paulo Henrique Guimarães
quelle
-1

Ihr Protokoll gibt GMT aus, sodass Sie Ihre Zeitzone angeben möchten:

var doo = new Date("2011-09-24 EST");
bmacx7
quelle
3
Diese Frage hat bereits viele Antworten. Wenn Sie die Frage trotzdem beantworten möchten, sollten Sie etwas Neues erwähnen, das die anderen Antworten nicht beantworten. Die Top-Antwort erklärt das Problem mit der Zeitzone bereits viel detaillierter.
Calvin Godfrey
Diese Antwort ist fast genau die gleiche wie stackoverflow.com/a/7556642/8828658
ein Stein Spinnentier
Wen kümmert es, wenn seine Erklärung ausführlicher ist ... sein Code unterscheidet sich immer noch von meinem. Meins ist viel einfacher. Und ja Stein Spinnentier du bist richtig. Mein Fehler.
bmacx7
-3

Vergiss nicht, ich habe den GMT -0400 nicht bemerkt, was dazu führt, dass das Datum gestern ist

Sie können versuchen, eine Standard- "Zeit" auf 12:00:00 festzulegen

ChrisH
quelle
Ja, ich war ein bisschen schnell mit meiner Antwort, tut mir leid. Meine Antwort wurde überarbeitet.
ChrisH
-3

Folgendes hat bei mir funktioniert -

    var doo = new Date("2011-09-24").format("m/d/yyyy");
Venu
quelle
Es wird immer noch nicht funktionieren, solange Sie nicht mit der Zeitzone herumgespielt haben.
Gar