Ich verwende Moment.js , um Daten in meiner Web-App zu analysieren und zu formatieren. Als Teil eines JSON-Objekts sendet mein Backend-Server Daten in Millisekunden ab der UTC-Epoche (Unix-Offset).
Das Parsen von Daten in einer bestimmten Zeitzone ist einfach. Fügen Sie vor dem Parsen einfach die RFC 822-Zeitzonen-ID an das Ende der Zeichenfolge an:
// response varies according to your timezone
const m1 = moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")
// problem solved, always "03/11 17:00"
const m2 = moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")
console.log({ m1, m2 })
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
Aber wie formatiere ich ein Datum in einer bestimmten Zeitzone ?
Ich möchte konsistente Ergebnisse unabhängig von der aktuellen Uhrzeit des Browsers, aber ich möchte keine Daten in UTC anzeigen.
javascript
timezone
momentjs
quietmint
quelle
quelle
DD MMM, YYYY
funktioniert nicht, wenn ich es gerne benutzemoment.tz("2018-02-15T14:20:00.000+0530", "Asia/Bangkok").format("DD MMM, YYYY")
. Kann mich jemand in der Dokumentation darauf hinweisen, wo ich bei Verwendung dieser API alle Schlüssel für die Formatierungszeit finden kann?"15 Feb, 2018"
. Wollten Sie Formatzeichenfolge verwendenDD MMMM, YYYY
, um zu erhalten"15 February, 2018"
?Antworten:
Wie in Mantos Antwort ausgeführt ,
.utcOffset()
ist dies ab Moment 2.9.0 die bevorzugte Methode. Diese Funktion verwendet den realen Versatz von UTC, nicht den umgekehrten Versatz (z. B. -240 für New York während der Sommerzeit). Versetzte Zeichenfolgen wie "+0400" funktionieren wie zuvor:Der Ältere
.zone()
als Setter war in Moment.js 2.9.0 veraltet . Es wurde eine Zeichenfolge akzeptiert, die eine Zeitzonen-ID (z. B. "-0400" oder "-04: 00" für -4 Stunden) oder eine Zahl enthält, die Minuten hinter UTC darstellt (z. B. 240 für New York während der Sommerzeit).Um mit benannten Zeitzonen anstelle von numerischen Offsets zu arbeiten, schließen Sie Moment Timezone ein und verwenden Sie
.tz()
stattdessen:quelle
.zone()
als Getter, der Minuten von UTC zurückgibt (z. B. 300 für New York während der Standardzeit)..tz("America/Phoenix")
wenn Sie momentjs.com/timezone angeben . Ich habe die Antwort mit einem Beispiel aktualisiert.Verwenden Sie die Moment-Zeitzone
Bevor Sie auf eine bestimmte Zeitzone zugreifen können, müssen Sie sie wie folgt laden (oder alternative Methoden verwenden, die hier beschrieben werden ).
quelle
In einigen Antworten wird bereits erwähnt, dass die Moment-Zeitzone der richtige Weg für die benannte Zeitzone ist. Ich möchte nur etwas über diese Bibliothek klarstellen, das für mich ziemlich verwirrend war. Es gibt einen Unterschied zwischen diesen beiden Aussagen:
Angenommen, in dem übergebenen Datum ist keine Zeitzone angegeben:
Der erste Code nimmt das Datum auf und nimmt an, dass die Zeitzone die übergebene ist. Der zweite Code nimmt das Datum an, übernimmt die Zeitzone vom Browser und ändert dann die Zeit und die Zeitzone entsprechend der übergebenen Zeitzone.
Beispiel:
Meine Zeitzone ist +5 von utc. Im ersten Fall ändert es sich also nicht und legt Datum und Uhrzeit für die utc-Zeitzone fest.
Im zweiten Fall wird davon ausgegangen, dass das übergebene Datum in -5 liegt, und dann in UTC umgewandelt. Deshalb wird das Datum "2018-07-18T00: 00: 00Z" ausgespuckt.
HINWEIS: Der Formatparameter ist sehr wichtig. Wenn der Moment weggelassen wird, kann er auf die Date-Klasse zurückgreifen, was zu unvorhersehbaren Verhaltensweisen führen kann
Angenommen, die Zeitzone wird in dem Datum angegeben, an dem Folgendes übergeben wurde:
In diesem Fall verhalten sich beide gleich
Obwohl ich jetzt verstehe, warum es so funktioniert, fand ich das ziemlich verwirrend und erklärenswert.
quelle
.zone () ist veraltet und Sie sollten stattdessen utcOffset verwenden:
quelle
Ich hatte das gleiche Problem mit Moment.js. Ich habe moment-timezone installiert, aber das Problem wurde nicht behoben. Dann habe ich genau das getan, was hier gezeigt wird, die Zeitzone eingestellt und es funktioniert wie ein Zauber:
Vielen Dank!
quelle
new Date()
Konstruktor nicht verwenden . Moment bietet alles, was Sie jemals brauchen würden, um Daten zu analysieren. Siehe Analysieren von Dokumenten.new Date()
intern verwenden), dies ist jedoch in allen Browsern inkonsistent . Verwenden Sie stattdessen das erwartete Format als zweites Argument. Beispiel :moment("12-25-1995", "MM-DD-YYYY")
.Ich bin gerade dazu gekommen, und da ich das gleiche Problem hatte, habe ich nur die Ergebnisse veröffentlicht, die ich mir ausgedacht habe
Beim Parsen können Sie den Offset aktualisieren (dh ich analysiere Daten (1.1.2014) und ich möchte nur das Datum, den 1. Januar 2014. Bei GMT + 1 würde ich den 31.12.2013 erhalten. Also versetze ich zuerst den Wert.
Nun, es hat sich für mich als nützlich erwiesen, über Zeitzonen hinweg zu unterstützen
B.
quelle
Sie können dies versuchen,
Hier können Sie das Datum basierend auf der Client-Zeitzone (Browser) abrufen.
Mit dem regulären Ausdruck erhalten Sie im Grunde den Versatzwert.
Prost!!
quelle