Signatur
Beschreibung
Die schreibgeschützte Zugriffs-Eigenschaft offsetNanoseconds liefert den Offset, mit dem der interne exakte Zeitpunkt (epochNanoseconds) in die lokale Wanduhrzeit der Zeitzone umgerechnet wird. Der Wert ist eine ganze Zahl (number): positiv für Zeitzonen östlich von UTC (z. B. 7200000000000 für +02:00), negativ für westliche Zeitzonen und 0 für UTC.
Der Offset hängt vom konkreten Zeitpunkt ab, nicht nur von der Zeitzone. In Europe/Berlin liefert dieselbe Eigenschaft im Winter 3600000000000 (MEZ) und im Sommer 7200000000000 (MESZ). Damit lassen sich Sommerzeit-Umstellungen erkennen oder Offsets numerisch vergleichen und verrechnen.
Das Gegenstück ist die Eigenschaft offset, die denselben Wert als formatierten String wie "+02:00" liefert. Für Anzeige und Serialisierung ist offset meist die bessere Wahl, für Berechnungen offsetNanoseconds. Weil die Eigenschaft nur lesend ist, ändert man den Offset nicht direkt. Stattdessen nimmt man withTimeZone() oder with() mit der Option offset.
Rückgabewert
0 = UTC.Beispiele
Sommer- und Winterzeit in Berlin vergleichen
const winter = Temporal.ZonedDateTime.from('2024-01-15T12:00[Europe/Berlin]');
const sommer = Temporal.ZonedDateTime.from('2024-07-15T12:00[Europe/Berlin]');
console.log(winter.offsetNanoseconds); // MEZ
console.log(sommer.offsetNanoseconds); // MESZ
console.log(sommer.offsetNanoseconds > winter.offsetNanoseconds ? 'Sommerzeit aktiv' : 'Normalzeit');
Offset in Stunden und Minuten umrechnen
const zdt = Temporal.ZonedDateTime.from('2024-07-04T09:30[America/New_York]');
const ns = zdt.offsetNanoseconds;
const minuten = ns / 60_000_000_000;
const stunden = ns / 3_600_000_000_000;
console.log(ns);
console.log(`${minuten} Minuten / ${stunden} Stunden`);
console.log(zdt.offset); // String-Pendant
Sommerzeit-Umstellung zwischen zwei Zeitpunkten erkennen
const hatOffsetWechsel = (a, b) => a.offsetNanoseconds !== b.offsetNanoseconds;
const vorher = Temporal.ZonedDateTime.from('2024-03-30T12:00[Europe/Berlin]');
const nachher = vorher.add({ days: 1 });
console.log(hatOffsetWechsel(vorher, nachher));
console.log(nachher.offsetNanoseconds - vorher.offsetNanoseconds); // 1 Stunde in ns
UTC und historische Offsets mit Sekundenanteil
const utc = Temporal.ZonedDateTime.from('2024-05-01T00:00[UTC]');
console.log(utc.offsetNanoseconds);
// Liberia nutzte bis 1972 den Offset -00:44:30
const monrovia = Temporal.ZonedDateTime.from('1950-01-01T12:00[Africa/Monrovia]');
console.log(monrovia.offsetNanoseconds);
console.log(monrovia.offset);
// Wichtig · Fallstricke
- Nur lesend: Eine Zuweisung wie
zdt.offsetNanoseconds = 0hat keine Wirkung (im Strict Mode gibt es einenTypeError). Einen anderen Offset bekommt man überwithTimeZone(). - Offset ist nicht die Zeitzone: Aus dem Offset allein lässt sich die Zeitzone nicht ableiten. Viele Zeitzonen teilen sich zeitweise denselben Offset, und eine Zone kann ihren Offset im Lauf der Zeit ändern. Speichern Sie deshalb immer
timeZoneId, nicht nur den Offset. - Genauigkeit: Der Wert ist eine
numberund keinbigint(anders alsepochNanoseconds). Da der Betrag unter 24 Stunden bleibt, ist er immer exakt darstellbar. - Offsets mit Sekundenanteil: Historische Offsets (z. B. die Ortszeit LMT vor 1900) haben oft Sekundenanteile. Rechnen Sie also nicht fest damit, dass der Wert ein Vielfaches von Minuten ist. Welche historischen Daten verfügbar sind, hängt von der Zeitzonen-Datenbank der jeweiligen Engine ab.
- Kompatibilität: Temporal ist noch nicht in allen Browsern verfügbar (Firefox ab 139, Chromium ab 144, Safari noch nicht). Für breite Unterstützung brauchen Sie ein Polyfill wie
@js-temporal/polyfillodertemporal-polyfill. Prüfen Sie die Unterstützung mittypeof Temporal !== 'undefined'.