Signatur
Beschreibung
Die Zugriffseigenschaft hours liefert das Stunden-Feld einer Temporal.Duration. Eine Dauer besteht aus zehn getrennten Feldern (years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). hours gibt nur den Wert dieses einen Feldes zurück.
Wichtig: Temporal gleicht Dauern nicht automatisch aus. Temporal.Duration.from({ minutes: 90 }) hat den hours-Wert 0 und nicht 1. Umgekehrt zählt hours bei P1DT2H nur die 2 Stunden, der Tag wird nicht mitgerechnet. Die Stunden in ausgeglichener Form bekommst du mit round({ largestUnit: "hours" }). Die Gesamtzahl der Stunden als Dezimalzahl liefert total({ unit: "hours" }).
Der Wert ist immer eine ganze Zahl. Sein Vorzeichen stimmt mit dem Vorzeichen der ganzen Dauer überein: Bei negativen Dauern ist er negativ oder 0. Die Eigenschaft kann nur gelesen werden, denn Temporal.Duration ist unveränderlich. Einen geänderten Wert bekommst du mit with({ hours: … }), das eine neue Instanz zurückgibt.
Rückgabewert
0, wenn keine Stunden angegeben sind.Beispiele
Stunden aus einem ISO-8601-String lesen
const dauer = Temporal.Duration.from("PT1H30M");
console.log(dauer.hours); // Stunden-Feld
console.log(dauer.minutes); // Minuten-Feld
const negativ = Temporal.Duration.from("-PT3H");
console.log(negativ.hours);
Arbeitszeit zwischen zwei Uhrzeiten
const beginn = Temporal.PlainTime.from("09:15");
const ende = Temporal.PlainTime.from("17:45");
const arbeitszeit = ende.since(beginn); // PT8H30M
console.log(`${arbeitszeit.hours} Std. ${arbeitszeit.minutes} Min.`);
Fallstrick: keine automatische Umrechnung
const d = Temporal.Duration.from({ minutes: 90 });
console.log(d.hours); // 0 – 90 Minuten werden nicht umgerechnet
const ausgeglichen = d.round({ largestUnit: "hours" });
console.log(ausgeglichen.hours, ausgeglichen.minutes);
console.log(d.total({ unit: "hours" })); // Dezimalwert
Differenz zweier Zeitpunkte in Stunden
const start = Temporal.PlainDateTime.from("2024-03-01T08:00");
const ziel = Temporal.PlainDateTime.from("2024-03-03T10:00");
// Standardmäßig ist die größte Einheit 'days'
console.log(start.until(ziel).hours); // nur Rest-Stunden (P2DT2H)
// Mit largestUnit alles in Stunden
console.log(start.until(ziel, { largestUnit: "hours" }).hours);
// Neue Dauer mit geändertem Stunden-Feld
console.log(Temporal.Duration.from("PT2H").with({ hours: 5 }).toString());
// Wichtig · Fallstricke
- Nicht ausgeglichen:
hoursenthält weder Tage noch überzählige Minuten. Für Anzeigen solltest du vorherround({ largestUnit: "hours" })aufrufen oder mittotal({ unit: "hours" })arbeiten. - Größte Einheit bei
since()/until():PlainDateTimeundZonedDateTimeverwenden standardmäßiglargestUnit: "days". BeiPlainTimeist es"hours". Das erklärt, warumhoursmanchmal unerwartet klein ist. - Zeitzonen: Bei
ZonedDateTimekann ein Tag wegen der Zeitumstellung 23 oder 25 Stunden haben. Stunden, die über Tagesgrenzen hinaus exakt stimmen müssen, bekommst du mitlargestUnit: "hours". - Nur lesbar: Eine Zuweisung wie
d.hours = 3wirkt nicht und löst im Strict Mode einenTypeErroraus. Nutze stattdessenwith(). - Kompatibilität: Temporal ist noch recht neu (Firefox 139+, Chromium 144+). Safari und ältere Node.js-Versionen unterstützen es noch nicht. Dort brauchst du einen Polyfill wie
@js-temporal/polyfillodertemporal-polyfill.