Hintergrund
Das JavaScript- Date
Objekt verfolgt die Zeit in UTC intern, akzeptiert jedoch normalerweise Eingaben und erzeugt Ausgaben in der Ortszeit des Computers, auf dem es ausgeführt wird. Es gibt nur sehr wenige Möglichkeiten, mit der Zeit in anderen Zeitzonen zu arbeiten.
Die interne Darstellung eines Date
Objekts ist eine einzelne Zahl, die die Anzahl der Millisekunden darstellt, die seitdem vergangen sind 1970-01-01 00:00:00 UTC
, ohne Rücksicht auf Schaltsekunden. Im Date-Objekt selbst ist keine Zeitzone oder kein Zeichenfolgenformat gespeichert. Wenn verschiedene Funktionen des Date
Objekts verwendet werden, wird die lokale Zeitzone des Computers auf die interne Darstellung angewendet. Wenn die Funktion eine Zeichenfolge erzeugt, können die Gebietsschemainformationen des Computers berücksichtigt werden, um zu bestimmen, wie diese Zeichenfolge erzeugt wird. Die Details variieren je nach Funktion und einige sind implementierungsspezifisch.
Die einzigen Operationen, die das Date
Objekt mit nicht lokalen Zeitzonen ausführen kann, sind:
Es kann eine Zeichenfolge analysieren, die einen numerischen UTC-Versatz von einer beliebigen Zeitzone enthält. Damit wird der zu analysierende Wert angepasst und das UTC-Äquivalent gespeichert. Die ursprüngliche Ortszeit und der Offset werden im resultierenden Date
Objekt nicht beibehalten . Beispielsweise:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toISOString() //=> "2020-04-12T16:00:00.000Z"
d.valueOf() //=> 1586707200000 (this is what is actually stored in the object)
In Umgebungen, in denen die ECMASCript Internationalization API (auch bekannt als "Intl") implementiert ist , kann ein Date
Objekt eine länderspezifische Zeichenfolge erstellen, die an eine bestimmte Zeitzonen- ID angepasst ist. Dies wird über die timeZone
Option toLocaleString
und ihre Variationen erreicht. Die meisten Implementierungen unterstützen IANA-Zeitzonen-IDs, z 'America/New_York'
. Beispielsweise:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toLocaleString('en-US', { timeZone: 'America/New_York' })
//=> "4/12/2020, 12:00:00 PM"
// (midnight in China on Apring 13th is noon in New York on April 12th)
Die meisten modernen Umgebungen unterstützen den vollständigen Satz von IANA-Zeitzonen-IDs ( siehe Kompatibilitätstabelle hier ). Doch bedenken Sie, dass die einzige Kennung erforderlich von Intl unterstützt werden soll 'UTC'
, so sollten Sie sorgfältig überprüfen , ob Sie älteren Browser oder atypische Umgebungen unterstützen müssen (zum Beispiel leichte IoT - Geräte).
Bibliotheken
Es gibt mehrere Bibliotheken, mit denen mit Zeitzonen gearbeitet werden kann. Obwohl sie das Date
Objekt immer noch nicht anders verhalten können, implementieren sie normalerweise die Standard-IANA-Zeitzonendatenbank und bieten Funktionen für die Verwendung in JavaScript. Moderne Bibliotheken verwenden die von der Intl-API bereitgestellten Zeitzonendaten. Ältere Bibliotheken haben jedoch normalerweise Overhead, insbesondere wenn Sie in einem Webbrowser ausgeführt werden, da die Datenbank etwas größer werden kann. In einigen dieser Bibliotheken können Sie den Datensatz auch selektiv reduzieren, entweder nach Zeitzonen und / oder nach Datumsbereich, mit dem Sie arbeiten können.
Hier sind die zu berücksichtigenden Bibliotheken:
Intl-basierte Bibliotheken
Neuentwicklungen sollten aus einer dieser Implementierungen wählen, deren Zeitzonendaten auf der Intl-API basieren:
Nicht-internationale Bibliotheken
Diese Bibliotheken werden verwaltet, müssen jedoch ihre eigenen Zeitzonendaten verpacken, die sehr groß sein können.
* Während Moment und Moment-Timezone zuvor empfohlen wurden, bevorzugt das Moment-Team jetzt Benutzer, die Luxon für die Neuentwicklung ausgewählt haben.
Ausgelaufene Bibliotheken
Diese Bibliotheken wurden offiziell eingestellt und sollten nicht mehr verwendet werden.
Zukünftige Vorschläge
Der TC39-Zeitvorschlag zielt darauf ab, einen neuen Satz von Standardobjekten für die Arbeit mit Datum und Uhrzeit in der JavaScript-Sprache selbst bereitzustellen. Dies umfasst die Unterstützung eines zeitzonensensitiven Objekts.