Signatur
Beschreibung
Die Methode valueOf() von Temporal.ZonedDateTime gibt absichtlich keinen Wert zurück. Sie wirft immer einen TypeError. Das ist eine bewusste Entscheidung im Design von Temporal: Bei Date liefert valueOf() einen Zeitstempel in Millisekunden. Dadurch funktionieren Ausdrücke wie date1 < date2 oder date2 - date1 zwar, sie führen aber oft zu unauffälligen Fehlern, etwa bei Zeitzonen oder bei ==-Vergleichen, die nur die Objektidentität prüfen.
JavaScript ruft valueOf() automatisch auf, wenn ein Objekt in eine Zahl oder einen primitiven Wert umgewandelt werden soll. Das passiert bei arithmetischen Operatoren (-, *, unäres +), bei relationalen Vergleichen (<, >, <=, >=) und bei Number(). Bei einem ZonedDateTime bricht all das sofort mit einem Fehler ab. So fallen falsche Nutzungen schon beim Entwickeln auf und schleichen sich nicht als falsche Ergebnisse ein.
Nutzen Sie stattdessen die dafür vorgesehenen Methoden:
Temporal.ZonedDateTime.compare(a, b)zum Sortieren und Vergleichena.equals(b)für einen Gleichheitstest (Zeitpunkt, Zeitzone und Kalender)a.until(b)bzw.a.since(b)für Differenzena.epochMillisecondsbzw.a.epochNanoseconds, wenn Sie wirklich einen Zahlenwert brauchen
Beispiele
Implizite Umwandlung löst TypeError aus
const start = Temporal.ZonedDateTime.from('2024-03-10T09:00[Europe/Berlin]');
const ende = Temporal.ZonedDateTime.from('2024-03-10T17:30[Europe/Berlin]');
try {
console.log(ende - start);
} catch (err) {
console.log(err instanceof TypeError, err.name);
}
try {
console.log(start < ende);
} catch (err) {
console.log('Vergleich nicht erlaubt:', err.name);
}
Richtig vergleichen und sortieren mit compare()
const termine = [
Temporal.ZonedDateTime.from('2024-06-01T14:00[Europe/Berlin]'),
Temporal.ZonedDateTime.from('2024-06-01T09:00[America/New_York]'),
Temporal.ZonedDateTime.from('2024-06-01T08:00[Europe/London]')
];
// termine.sort((a, b) => a - b) würde einen TypeError werfen
termine.sort(Temporal.ZonedDateTime.compare);
console.log(termine.map((t) => t.toString()));
Differenz berechnen und Zahlenwert gezielt abrufen
const abflug = Temporal.ZonedDateTime.from('2024-07-01T10:15[Europe/Berlin]');
const landung = Temporal.ZonedDateTime.from('2024-07-01T13:05[America/New_York]');
// Statt landung - abflug:
const dauer = abflug.until(landung, { largestUnit: 'hour' });
console.log(dauer.toString());
// Wenn wirklich eine Zahl gebraucht wird: explizit anfordern
const ms = landung.epochMilliseconds - abflug.epochMilliseconds;
console.log(ms / 60000, 'Minuten');
// Wichtig · Fallstricke
- Gleichheit mit
==/===: Diese Operatoren rufenvalueOf()nicht auf, wenn beide Seiten Objekte sind. Sie vergleichen nur die Referenz und liefern ohne Fehlerfalse, auch wenn beide Instanzen denselben Zeitpunkt darstellen. Verwenden Sieequals(). - String-Verkettung funktioniert: Bei Template-Literalen und
String(zdt)wirdtoString()verwendet.`${zdt}`wirft also keinen Fehler.'' + zdtdagegen nutzt den Hinweis „default“ und landet beivalueOf(), deshalb wirft es. - Umstieg von
Date: Bestehender Code wiearr.sort((a, b) => a - b)oderif (d1 < d2)muss beim Wechsel auf Temporal umgeschrieben werden. - Kompatibilität: Temporal wird noch nicht überall unterstützt: Firefox ab 139, Chromium-Browser ab 144, Safari noch nicht. Für ältere Umgebungen gibt es Polyfills wie
@js-temporal/polyfillodertemporal-polyfill.