Signatur
Beschreibung
Die Methode valueOf() von Temporal.PlainDateTime gibt keinen Wert zurück, sondern wirft immer einen TypeError. Das ist Absicht: JavaScript ruft valueOf() automatisch auf, wenn ein Objekt in eine Zahl oder einen anderen primitiven Wert umgewandelt werden muss, zum Beispiel bei den Vergleichsoperatoren <, >, <=, >= oder bei arithmetischen Operatoren wie - und +.
Beim alten Date-Objekt liefert valueOf() einen Zeitstempel in Millisekunden. Darum funktionieren dort Ausdrücke wie date2 - date1 oder date1 < date2. Ein PlainDateTime hat aber keine Zeitzone und entspricht damit keinem eindeutigen Zeitpunkt. Eine versteckte Umwandlung in eine Zahl oder in einen Text würde leicht zu falschen Ergebnissen führen, etwa weil Zeichenketten lexikografisch verglichen werden. Das gilt besonders bei Jahren außerhalb von 0000–9999 oder bei anderen Kalendern.
Verwende stattdessen die dafür gedachten Methoden:
Temporal.PlainDateTime.compare(a, b)zum Sortieren und Vergleichen (gibt-1,0oder1zurück)a.equals(b)zur Prüfung auf Gleichheita.until(b)bzw.a.since(b)für Differenzen alsTemporal.DurationtoString()odertoJSON()für eine ausdrückliche Umwandlung in einen Text
Du rufst valueOf() praktisch nie selbst auf. Wichtig ist nur, zu wissen, warum ein Operator bei PlainDateTime einen Fehler auslöst.
Rückgabewert
TypeError.Beispiele
Vergleichsoperator löst TypeError aus
const start = Temporal.PlainDateTime.from('2024-03-01T09:00');
const ende = Temporal.PlainDateTime.from('2024-03-01T17:30');
try {
console.log(start < ende); // ruft intern valueOf() auf
} catch (err) {
console.log(err instanceof TypeError);
}
Richtig vergleichen und sortieren mit compare()
const termine = [
Temporal.PlainDateTime.from('2024-05-10T14:00'),
Temporal.PlainDateTime.from('2024-05-09T08:15'),
Temporal.PlainDateTime.from('2024-05-10T09:30'),
];
termine.sort(Temporal.PlainDateTime.compare);
console.log(termine.map(String));
const [a, b] = termine;
console.log(Temporal.PlainDateTime.compare(a, b) < 0); // a liegt vor b
console.log(a.equals(b));
Differenz mit until() statt Subtraktion
const start = Temporal.PlainDateTime.from('2024-03-01T09:00');
const ende = Temporal.PlainDateTime.from('2024-03-01T17:30');
// start - ende würde einen TypeError werfen
const dauer = start.until(ende);
console.log(dauer.toString());
console.log(dauer.total({ unit: 'minutes' }));
Ausdrückliche Umwandlung in Text funktioniert
const dt = Temporal.PlainDateTime.from('2024-12-24T18:00');
// Template-Literale und String() rufen toString() auf, nicht valueOf()
console.log(`Bescherung: ${dt}`);
console.log(JSON.stringify({ zeit: dt }));
try {
const x = dt + 1; // + mit Hint "default" → valueOf() → TypeError
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Auch
==funktioniert nicht wie erwartet: Zwei verschiedene Instanzen mit demselben Datum sind nie===bzw.==gleich, weil dabei Objekt-Referenzen verglichen werden. Verwendeequals(). Beim Vergleich mit einem primitiven Wert (z. B.dt == 'abc') wird eine Umwandlung ausgelöst und dabei einTypeErrorgeworfen. - Umstieg von
Date: Code, der Daten mit<oder-vergleicht, lässt sich nicht einfach übernehmen. Er muss aufcompare(),until()bzw.since()umgestellt werden. - Kein Zeitstempel:
PlainDateTimehat keine Zeitzone. Für echte Zeitpunkte brauchst dutoZonedDateTime(zeitzone)und danach z. B.epochMilliseconds. Array.prototype.sort()ohne Vergleichsfunktion wandelt die Elemente in Texte um. Das wirft keinen Fehler, kann aber falsch sortieren, zum Beispiel bei erweiterten Jahreszahlen oder nicht-gregorianischen Kalendern. Übergib daher immerTemporal.PlainDateTime.compare.- Kompatibilität: Temporal ist in Firefox (ab 139) und Chrome (ab 144) verfügbar. Safari und ältere Umgebungen brauchen ein Polyfill wie
@js-temporal/polyfillodertemporal-polyfill.