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)
javascript
date
Levi
quelle
quelle
Antworten:
Beachten Sie, dass die östliche Sommerzeit ist
-4 hours
und dass die Stunden an dem Datum, an dem Sie zurückkommen, sind20
.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 anderengetUTC*()
Funktionen :quelle
EDT
ist die Sommerzeit (auch als Sommerzeit bezeichnet) undEST
die Zeitzone, die im Januar gilt.new Date('2012-01-01 GMT')
, wird immer noch ein Versatz angewendet, da dieser in die lokale Datums- und Uhrzeit des Benutzers konvertiert wird.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.Es gibt einige verrückte Dinge, die mit einem JS DATE- Objekt passieren , das Zeichenfolgen konvertiert, z. B. das folgende von Ihnen angegebene Datum
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.
quelle
So normalisieren Sie das Datum und beseitigen den unerwünschten Versatz (hier getestet: https://jsfiddle.net/7xp1xL5m/ ):
Dies bewirkt auch dasselbe und schreibt @tpartee zu (hier getestet: https://jsfiddle.net/7xp1xL5m/1/ ):
quelle
doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
Wenn Sie die Stunde 0 eines Datums in der lokalen Zeitzone erhalten möchten, übergeben Sie die einzelnen Datumsteile an den
Date
Konstruktor.quelle
Ich möchte nur hinzufügen, dass das Hinzufügen eines Leerzeichens am Ende der Zeichenfolge UTC für die Erstellung verwendet.
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.
quelle
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:
quelle
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 SietoUTCString()
stattdessen die Methode, um die GMT-Zeichenfolge abzurufen:quelle
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
Anscheinend ist d1 das, was ich will. Hoffe, das wäre für einige Leute hilfreich.
quelle
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:
quelle
Es bedeutet
2011-09-24 00:00:00 GMT
, und da Sie gerade dabei sindGMT -4
, wird es20:00
der vorherige Tag sein.Persönlich verstehe ich
2011-09-24 02:00:00
, weil ich bei wohneGMT +2
.quelle
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.
Beachten Sie, dass Sie ein weiteres Stück JS-Verrücktheit berücksichtigen müssen: Der Monat basiert auf Null.
quelle
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());
quelle
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:
Fügen Sie einfach die Nullen hinzu.
In meinem Code mache ich das:
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
quelle
.toISOString()
, geht es 1 Tag zurück.new Date('2019/11/18 05:30:00').toISOString();
arbeitete für michDer beste Weg, dies zu handhaben, ohne weitere Konvertierungsmethoden zu verwenden,
Fügen Sie jetzt einfach GMT zu Ihrem Datum hinzu oder Sie können es anhängen.
Live: https://jsfiddle.net/gajender/2kop9vrk/1/
quelle
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.
Wenn ich also aus der Datenbank komme und das Datum überprüfe, wird ein Offset hinzugefügt und an Javascript zurückgesendet.
Es wird +05: 00 hinzugefügt, da dies meine Server-Zeitzone ist. Mein Kunde befindet sich in einer anderen Zeitzone +07: 00.
Hier ist meine Lösung, was ich mit diesem Problem mache.
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.
quelle
Wenn Sie hierfür eine einfache Lösung benötigen, siehe:
quelle
Sie verwenden das ISO-Datumszeichenfolgenformat, das laut dieser Seite bewirkt, dass das Datum mithilfe der UTC-Zeitzone erstellt wird:
Wenn Sie den Text anders formatieren, z. B.
"Jan 01 1970"
(zumindest auf meinem Computer), wird Ihre lokale Zeitzone verwendet.quelle
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.
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.
Wie oben erwähnt, besteht eine schnelle Lösung darin, "-" durch "/" in Ihrer ISO-formatierten Nur-Datum-Zeichenfolge zu ersetzen.
quelle
Beim Speichern
yyyy-mm-dd
im MySQL-Datumsformat müssen Sie Folgendes tun:quelle
Ihr Protokoll gibt GMT aus, sodass Sie Ihre Zeitzone angeben möchten:
quelle
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
quelle
Folgendes hat bei mir funktioniert -
quelle