Start · Sprachen · JavaScript · Referenz · Temporal.ZonedDateTime.prototype.epochNanoseconds

Temporal.ZonedDateTime.prototype.epochNanoseconds

Eigenschaft

Liefert als <code>BigInt</code> die Anzahl der Nanosekunden seit dem Unix-Epoch (1. Januar 1970, 00:00 UTC) bis zu dem Zeitpunkt, den die <code>ZonedDateTime</code> darstellt.

seit JavaScript ES2026 (Temporal); Firefox 139+, Chrome 144+; Safa Kategorie: method-property

Signatur

get Temporal.ZonedDateTime.prototype.epochNanoseconds

Beschreibung

Die Zugriffseigenschaft epochNanoseconds gibt den exakten Zeitpunkt einer Temporal.ZonedDateTime als BigInt zurück. Gemeint sind die Nanosekunden seit dem Unix-Epoch, also seit Mitternacht am Anfang des 1. Januar 1970 (UTC). Die Zeitzone und der Kalender der Instanz spielen für den Wert keine Rolle: Zwei ZonedDateTime-Objekte, die denselben Zeitpunkt in verschiedenen Zeitzonen darstellen, haben denselben Wert für epochNanoseconds.

Die Eigenschaft ist die genaueste Darstellung eines Zeitpunkts in Temporal. Das ist nützlich, wenn Zeitstempel verlustfrei gespeichert, verglichen oder serialisiert werden sollen, zum Beispiel für Datenbanken, Protokolldateien oder den Austausch mit Systemen, die in Nanosekunden rechnen (etwa process.hrtime.bigint() in Node.js oder Tracing-Formate wie OpenTelemetry). Aus dem Wert lässt sich mit Temporal.Instant.fromEpochNanoseconds() und new Temporal.ZonedDateTime(ns, timeZone) wieder ein vollständiges Objekt erzeugen.

Die Eigenschaft ist nur lesbar. Es gibt keinen Setter. Um einen anderen Zeitpunkt zu erhalten, erzeugt man mit add(), subtract() oder with() ein neues Objekt. Wer nur Millisekunden braucht, zum Beispiel für den Austausch mit Date, verwendet besser epochMilliseconds, das eine normale number zurückgibt.

Rückgabewert

Typ
bigint
Beschreibung
Ganzzahl (BigInt) mit den Nanosekunden seit dem Unix-Epoch. Bei Zeitpunkten vor 1970 ist der Wert negativ. Der Wertebereich reicht von -8.64e21n bis 8.64e21n (±108 Tage).

Beispiele

Zeitstempel in Nanosekunden auslesen

const zdt = Temporal.ZonedDateTime.from("2024-03-15T12:30:00.123456789+01:00[Europe/Berlin]");

console.log(zdt.epochNanoseconds);
console.log(typeof zdt.epochNanoseconds);
1710502200123456789n bigint

Wert unabhängig von der Zeitzone

const berlin = Temporal.ZonedDateTime.from("2024-06-01T10:00:00+02:00[Europe/Berlin]");
const tokio = berlin.withTimeZone("Asia/Tokyo");

console.log(tokio.toString());
console.log(berlin.epochNanoseconds === tokio.epochNanoseconds);
2024-06-01T17:00:00+09:00[Asia/Tokyo] true

Verlustfrei speichern und wiederherstellen

const original = Temporal.Now.zonedDateTimeISO("Europe/Berlin");

// BigInt ist nicht JSON-fähig → als String speichern
const json = JSON.stringify({
  ns: original.epochNanoseconds.toString(),
  tz: original.timeZoneId,
});

const { ns, tz } = JSON.parse(json);
const restored = new Temporal.ZonedDateTime(BigInt(ns), tz);

console.log(restored.equals(original));
true

Dauer in Nanosekunden berechnen und sortieren

const start = Temporal.ZonedDateTime.from("2024-01-01T00:00:00Z[UTC]");
const ende = start.add({ milliseconds: 1, nanoseconds: 500 });

const diffNs = ende.epochNanoseconds - start.epochNanoseconds;
console.log(diffNs);

const events = [ende, start];
events.sort((a, b) => (a.epochNanoseconds < b.epochNanoseconds ? -1 : 1));
console.log(events.map((e) => e.toString()));
1000500n ["2024-01-01T00:00:00+00:00[UTC]", "2024-01-01T00:00:00.0010005+00:00[UTC]"]

// Wichtig · Fallstricke

  • BigInt, keine Number: Man kann den Wert nicht mit number mischen (zdt.epochNanoseconds + 1 wirft einen TypeError). Richtig ist + 1n. JSON.stringify() kann BigInt nicht serialisieren, daher vorher .toString() verwenden.
  • Nicht mit Number() umwandeln: Werte über Number.MAX_SAFE_INTEGER verlieren an Genauigkeit. Für Millisekunden ist epochMilliseconds die richtige Wahl.
  • Vergleiche: Zum Sortieren ist Temporal.ZonedDateTime.compare() meist lesbarer. Beachte, dass equals() auch Zeitzone und Kalender vergleicht, epochNanoseconds dagegen nur den reinen Zeitpunkt.
  • Nur lesbar: Eine Zuweisung wird still ignoriert, im Strict Mode wirft sie einen TypeError.
  • Kompatibilität: Temporal ist noch neu (Firefox 139+, Chrome 144+). Für ältere Umgebungen ist ein Polyfill nötig, etwa @js-temporal/polyfill oder temporal-polyfill.