Signatur
Beschreibung
Die Zugriffseigenschaft epochMilliseconds liefert den exakten Zeitpunkt eines Temporal.ZonedDateTime als ganzzahlige Millisekundenzahl seit der Unix-Epoche (Mitternacht zu Beginn des 1. Januar 1970, UTC). Der Wert hängt nur vom Zeitpunkt ab, nicht von der Zeitzone oder dem Kalender: Zwei Objekte, die denselben Moment in Berlin und in Tokio darstellen, haben denselben Wert für epochMilliseconds.
Wofür braucht man das? Vor allem für die Zusammenarbeit mit Code, der Zeitstempel erwartet, etwa Date (new Date(ms)), Date.now()-Vergleiche, JSON-APIs, Datenbanken oder localStorage, die Unix-Zeitstempel in Millisekunden speichern. Mit Temporal.Instant.fromEpochMilliseconds() und toZonedDateTimeISO() geht es in die umgekehrte Richtung.
Intern speichert Temporal Zeitpunkte mit Nanosekunden-Genauigkeit. epochMilliseconds entspricht epochNanoseconds / 1_000_000, abgerundet (in Richtung minus unendlich). Die Nachkommastellen unterhalb einer Millisekunde gehen also verloren. Wer die volle Genauigkeit braucht, nimmt epochNanoseconds (ein BigInt).
Die Eigenschaft ist nur lesbar. Es gibt keinen Setter, denn Temporal-Objekte sind unveränderlich. Einen anderen Zeitpunkt erzeugt man mit add(), subtract(), with() oder über ein neues Instant.
Rückgabewert
Date.Beispiele
Zeitstempel eines Zeitpunkts in einer Zeitzone
const zdt = Temporal.ZonedDateTime.from("2024-01-01T00:00:00+01:00[Europe/Berlin]");
console.log(zdt.epochMilliseconds);
// Gleicher Moment in UTC: 2023-12-31T23:00:00Z
console.log(zdt.toInstant().toString());
Unabhängig von der Zeitzone
const berlin = Temporal.ZonedDateTime.from("2024-06-15T12:00:00[Europe/Berlin]");
const tokio = berlin.withTimeZone("Asia/Tokyo");
console.log(tokio.toString());
console.log(berlin.epochMilliseconds === tokio.epochMilliseconds);
Brücke zu Date und zurück
// Temporal → Date (z. B. für eine ältere Bibliothek)
const termin = Temporal.ZonedDateTime.from("2025-03-30T09:30:00[Europe/Berlin]");
const date = new Date(termin.epochMilliseconds);
console.log(date.toISOString());
// Zeitstempel aus einer API → ZonedDateTime
const apiTimestamp = 1743319800000;
const zurueck = Temporal.Instant
.fromEpochMilliseconds(apiTimestamp)
.toZonedDateTimeISO("Europe/Berlin");
console.log(zurueck.toString());
Abrunden bei Zeitpunkten vor 1970
const zdt = Temporal.ZonedDateTime.from("1969-12-31T23:59:59.9995+00:00[UTC]");
console.log(zdt.epochNanoseconds); // volle Genauigkeit
console.log(zdt.epochMilliseconds); // abgerundet, nicht in Richtung 0 abgeschnitten
// Wichtig · Fallstricke
- Genauigkeit geht verloren: Mikro- und Nanosekunden werden abgerundet (
Math.floor-Verhalten, auch bei negativen Werten). Das Hin- und Zurückwandeln über Millisekunden ist daher nicht verlustfrei. Für exakte Vergleiche solltest duepochNanosecondsoderTemporal.ZonedDateTime.compare()verwenden. - Nicht mit Sekunden verwechseln: Viele Backends (Unix-
time(), JWT-exp) arbeiten mit Sekunden. Teile dann durch 1000 und runde bewusst, z. B. mitMath.floor(zdt.epochMilliseconds / 1000). Eine eigene EigenschaftepochSecondsgab es nur in frühen Entwürfen, sie wurde entfernt. - Zeitzone und Kalender fehlen im Wert: Aus der Zahl allein kannst du das ursprüngliche
ZonedDateTimenicht wiederherstellen. Wenn die Zeitzone wichtig ist, speicheretoString()(z. B.…+01:00[Europe/Berlin]). - Kompatibilität: Temporal ist in Firefox (ab 139) und in Chromium-Browsern (ab 144) verfügbar, in Safari und älteren Node.js-Versionen noch nicht. Als Ersatz gibt es z. B. den Polyfill
@js-temporal/polyfill. Prüfe die Unterstützung mittypeof Temporal !== \"undefined\".