Signatur
Beschreibung
Die Methode valueOf() von Temporal.PlainTime ist absichtlich so gebaut, dass sie immer einen TypeError wirft. JavaScript ruft valueOf() automatisch auf, wenn ein Objekt in einen primitiven Wert umgewandelt werden soll, etwa bei arithmetischen Operatoren (-, +) oder relationalen Vergleichen (<, >, <=, >=). Bei Date liefert valueOf() einen Zeitstempel, bei Temporal.PlainTime wird dieses stillschweigende und fehleranfällige Verhalten dagegen bewusst unterbunden.
Ohne diese Sperre würde JavaScript auf toString() zurückgreifen und zwei Uhrzeiten als Zeichenketten vergleichen. Das liefert zwar oft ein plausibles Ergebnis, ist aber nicht zuverlässig. Deshalb erzwingt Temporal explizite Aufrufe: Zum Vergleichen verwenden Sie Temporal.PlainTime.compare() oder equals(), und für Zeitabstände until(), since() oder subtract().
Die Methode rufen Sie praktisch nie direkt auf. Wichtig ist sie vor allem dann, wenn Sie bestehenden Date-Code auf Temporal umstellen: Jeder Ausdruck wie a < b oder a - b mit PlainTime-Objekten führt jetzt zu einem Laufzeitfehler, statt ein falsches Ergebnis zu liefern.
Rückgabewert
TypeError.Beispiele
Implizite Umwandlung löst TypeError aus
const start = Temporal.PlainTime.from('09:30');
const ende = Temporal.PlainTime.from('17:15');
try {
console.log(start < ende);
} catch (err) {
console.log(err instanceof TypeError, err.name);
}
try {
console.log(ende - start);
} catch (err) {
console.log('Subtraktion nicht erlaubt:', err.name);
}
Richtig vergleichen mit compare() und equals()
const a = Temporal.PlainTime.from('08:00');
const b = Temporal.PlainTime.from('12:45:30');
console.log(Temporal.PlainTime.compare(a, b)); // -1, 0 oder 1
console.log(a.equals(Temporal.PlainTime.from('08:00:00')));
// Sortieren einer Liste von Uhrzeiten
const termine = ['14:00', '09:15', '11:30'].map((t) => Temporal.PlainTime.from(t));
termine.sort(Temporal.PlainTime.compare);
console.log(termine.map(String));
Zeitdifferenz explizit berechnen statt a - b
const arbeitsbeginn = Temporal.PlainTime.from('08:45');
const feierabend = Temporal.PlainTime.from('17:10');
const dauer = arbeitsbeginn.until(feierabend);
console.log(dauer.toString());
console.log(dauer.total({ unit: 'minutes' }));
Prüfen, ob eine Uhrzeit im Öffnungszeitraum liegt
const oeffnet = Temporal.PlainTime.from('10:00');
const schliesst = Temporal.PlainTime.from('18:30');
const istGeoeffnet = (zeit) =>
Temporal.PlainTime.compare(zeit, oeffnet) >= 0 &&
Temporal.PlainTime.compare(zeit, schliesst) < 0;
console.log(istGeoeffnet(Temporal.PlainTime.from('12:00')));
console.log(istGeoeffnet(Temporal.PlainTime.from('19:00')));
// Wichtig · Fallstricke
- Migrationsfalle: Code, der mit
Datefunktioniert hat (d1 < d2,d2 - d1), wirft mitTemporal.PlainTimeeinenTypeError. Ersetzen Sie solche Ausdrücke durchcompare(),equals()oderuntil()/since(). ==und===werfen keinen Fehler: Sie vergleichen Objektreferenzen. Deshalb ergibtTemporal.PlainTime.from('10:00') === Temporal.PlainTime.from('10:00')den Wertfalse. Für einen Vergleich der Werte nutzen Sieequals().- Umwandlung in Zeichenketten funktioniert: Template-Literale und
String(zeit)gehen übertoString()und nicht übervalueOf(). Sie sind also erlaubt, zum Beispiel`${zeit}`→"10:00:00". Der Operator+mit einer Zeichenkette ruft dagegen zuerstvalueOf()auf und wirft deshalb einen Fehler. - Kompatibilität: Temporal ist noch nicht in allen Browsern verfügbar. Unterstützt wird es in Firefox ab 139 und in Chromium-Browsern ab 144, in Safari bisher nicht. Für Node.js und ältere Umgebungen gibt es ein Polyfill, z. B.
@js-temporal/polyfillodertemporal-polyfill.