Start · Sprachen · JavaScript · Referenz · Temporal.PlainTime.prototype.subtract()

Temporal.PlainTime.prototype.subtract()

Methode

Gibt ein neues <code>Temporal.PlainTime</code> zurück, das um die angegebene Dauer früher liegt; das Ergebnis läuft über Mitternacht hinweg auf der 24-Stunden-Uhr zurück.

seit JavaScript Temporal-Proposal (Firefox 139+, Chrome/Edge 144+; Kategorie: method-property

Signatur

Temporal.PlainTime.prototype.subtract(duration)

Beschreibung

Die Methode subtract() zieht eine Dauer von einer Uhrzeit ohne Datum und ohne Zeitzone ab. Das ursprüngliche Objekt bleibt unverändert, denn alle Temporal-Objekte sind unveränderlich. Zurückgegeben wird immer eine neue Temporal.PlainTime-Instanz.

Als Dauer ist alles erlaubt, was Temporal.Duration.from() annimmt: eine Temporal.Duration, ein Objekt wie { hours: 1, minutes: 30 } oder ein ISO-8601-Dauerstring wie "PT1H30M". t.subtract(d) liefert dasselbe Ergebnis wie t.add(d.negated()).

Weil PlainTime kein Datum kennt, rechnet die Methode zyklisch auf der 24-Stunden-Uhr: Zieht man von 01:00 drei Stunden ab, erhält man 22:00. Datumsanteile der Dauer (years, months, weeks, days) werden ignoriert. Es werden nur Stunden bis Nanosekunden verrechnet.

Typische Einsatzfälle: Weckzeiten, Öffnungszeiten, Schichtpläne oder „X Minuten vor Termin“-Erinnerungen, bei denen es nur auf die Uhrzeit ankommt. Wer über Tagesgrenzen hinweg rechnen und den Datumswechsel sehen muss, sollte Temporal.PlainDateTime oder Temporal.ZonedDateTime verwenden.

Parameter

Name Typ Default Beschreibung
$duration Pflicht Temporal.Duration | object | string Die abzuziehende Dauer: eine Temporal.Duration, ein Objekt mit Feldern wie hours, minutes, seconds, milliseconds, microseconds, nanoseconds oder ein ISO-8601-Dauerstring (z. B. "PT45M"). Negative Dauern verschieben die Zeit nach vorn.

Rückgabewert

Typ
Temporal.PlainTime
Beschreibung
Eine neue Temporal.PlainTime-Instanz mit der um duration früheren Uhrzeit, bei Bedarf über Mitternacht zurückgerechnet.

Beispiele

Stunden und Minuten abziehen

const start = Temporal.PlainTime.from("10:30:00");
const frueher = start.subtract({ hours: 2, minutes: 15 });

console.log(frueher.toString());
console.log(start.toString()); // Original bleibt unverändert
08:15:00 10:30:00

Überlauf über Mitternacht

const nachtschicht = Temporal.PlainTime.from("01:00");
const beginn = nachtschicht.subtract({ hours: 3 });

console.log(beginn.toString()); // läuft auf den Vortag zurück, ohne Datum
22:00:00

Erinnerung vor einem Termin mit ISO-Dauerstring

const termin = Temporal.PlainTime.from("14:00");
const vorlauf = Temporal.Duration.from("PT1H30M");

const erinnerung = termin.subtract(vorlauf);
console.log(`Erinnerung um ${erinnerung.toString({ smallestUnit: "minute" })}`);
Erinnerung um 12:30

Datumsanteile werden ignoriert, negative Dauer verschiebt nach vorn

const t = Temporal.PlainTime.from("10:30");

console.log(t.subtract({ days: 1, hours: 1 }).toString()); // days wird ignoriert
console.log(t.subtract({ hours: -1 }).toString());          // entspricht add({ hours: 1 })
09:30:00 11:30:00

// Wichtig · Fallstricke

  • Kein Datumswechsel sichtbar: Das Ergebnis läuft still über Mitternacht zurück. Ob dabei der Vortag erreicht wurde, erfährt man nicht. Dafür Temporal.PlainDateTime verwenden.
  • Datumseinheiten zählen nicht: years, months, weeks und days werden ohne Fehler ignoriert. Das kann Logikfehler verdecken, zum Beispiel wenn aus Versehen { days: 1 } statt { hours: 24 } übergeben wird. Beides ändert die Uhrzeit nicht.
  • Unveränderlichkeit: subtract() ändert das Objekt nicht. Das Ergebnis muss zugewiesen werden.
  • Ungültige Eingaben: Ein Objekt ohne gültiges Dauerfeld, ein fehlerhafter String oder gemischte Vorzeichen (z. B. { hours: 1, minutes: -5 }) lösen einen RangeError bzw. TypeError aus.
  • Kompatibilität: Temporal ist neu. Nativ gibt es die API in Firefox ab 139 und in Chromium-Browsern ab 144. Safari und ältere Node.js-Versionen brauchen einen Polyfill wie @js-temporal/polyfill. Vorher mit typeof Temporal !== \"undefined\" prüfen.