Moment: Ist es möglich, die Backend-Zeitzone beizubehalten?

Erstellt am 4. Okt. 2018  ·  3Kommentare  ·  Quelle: moment/moment

Beschreibung des Problems und Schritte zur Reproduktion:
Angenommen, ich habe ein Datum vom Backend in diesem Format erhalten:

"2018-10-10T13:00:00+11:00"

Was ich nach dem Parsen und Formatieren im Frontend erwarte:

10-10-2018 1.00 PM

Was ich bekam:

10-10-2018 5.00 AM

Meine Systemzeitzone ist mir egal. Ich möchte auch keine UTC-Zeit sehen. Wie kann ich es erreichen?

Bitte geben Sie die Werte aller verwendeten Variablen an.

Siehe oben.

Umfeld:

Es spielt keine Rolle, es sollte nicht von der Umgebung abhängen. Das ist übrigens das Problem, denn es kommt darauf an!

Hilfreichster Kommentar

Sie könnten parseZone versuchen:

zB für eine lokale Zeitzone in BST (UTC + 1)

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"

Alle 3 Kommentare

Afaik, Moment verwendet beim Formatieren eines Datums standardmäßig die Zeitzone des Geräts (was auch das Standardverhalten von Javascript ist). Also ja, die Formatierung eines Datums sollte von der Umgebung abhängen. Auf meinem Gerät erhalte ich beispielsweise Folgendes für Ihr Datum, das die korrekte Zeit für meine Ortszeit (Auckland) ist:

moment("2018-10-10T13:00:00+11:00").format()
// => '2018-10-10T15:00:00+13:00'

Wenn Sie manuell eine Standardzeitzone für den Benutzer festlegen möchten, können Sie moment-timezone mit einem IANA-Zeitzonennamen verwenden:

moment.tz.setDefault('America/New_York');

Dadurch wird erzwungen, dass alle Formatierungen für diese Zeitzone durchgeführt werden und unabhängig von der Umgebung sind.

Hier ist ein Link zu den Dokumenten: https://momentjs.com/timezone/docs/#/using -timezones/default-timezone/


Es ist nicht möglich, die Zeitzone des Benutzers aus dem Offset herauszufinden (weil mehrere Zeitzonen denselben Offset haben können, zB abhängig von der Sommerzeit), aber Sie können die Etc Zonennamen für "allgemeine" Zonen verwenden, zB Etc/GMT-11 in Ihrem Fall (das Vorzeichen ist für diese Zonen invertiert). In Ihrem Fall wäre es wahrscheinlich sinnvoller, die Zeitzone des Benutzers als Einstellung zu speichern und auf dem Server zu speichern oder zusammen mit dem Zeitstempel zu speichern.

Dann können Sie ein einzelnes Datum in einer bestimmten Zeitzone drucken, indem Sie zB verwenden

moment.tz("2018-10-10T13:00:00+11:00", "America/New_York");

Danke, @simonhaenisch

Ich habe das tz-Plugin gesehen, aber ich dachte, es hilft beim Verwalten von Zeitzonen, z. B. beim Konvertieren von einer in eine andere . Und es klingt komisch für mich, es nur zu verwenden, um die Zeitzone überhaupt NICHT zu berühren :)

Wenn Sie manuell eine Standardzeitzone für den Benutzer festlegen möchten

Leider gibt es auf dem Server keine default Zeitzone. Jeder Benutzer hat seine eigene Zeitzone, die im Profil gespeichert ist. Und das Frontend weiß nichts davon.

Es ist nicht möglich, die Zeitzone des Benutzers aus dem Offset herauszufinden

Das ist ok, die Zeitzone ist mir egal. Alles, was ich brauche, ist, das kommende Datum unverändert einzuhalten.

die Zeitzone des Benutzers als Einstellung speichern und auf dem Server beibehalten oder zusammen mit dem Zeitstempel speichern.

Genau das passiert. Die Zeitzone ist eine Einstellung und das mit ihr gespeicherte Datum als Zeitstempel.

Da die Backend-API unter meiner Kontrolle ist, kann ich nur eine reduzierte Version des Datums ohne Zeitzonenverschiebung senden. Ich hoffe, es hilft.

Aber es ist wirklich interessant, warum die moment.js so etwas nicht hat:

moment(somDateTime).format({ formatWithDeviceTimezone: true })

oder irgendwie :)

Wobei formatWithDeviceTimezone standardmäßig falsch ist.

Trotzdem danke, jetzt sehe ich das Problem.

Sie könnten parseZone versuchen:

zB für eine lokale Zeitzone in BST (UTC + 1)

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen