Signatur
Beschreibung
add() rechnet eine Dauer auf einen Datum-Uhrzeit-Wert ohne Zeitzone auf. Die Dauer kann als Temporal.Duration, als einfaches Objekt wie { days: 3, hours: 2 } oder als ISO-8601-Dauer-Zeichenkette wie "P1DT2H" übergeben werden. Das ursprüngliche Objekt wird nicht verändert, denn alle Temporal-Objekte sind unveränderlich.
Die Rechnung läuft in zwei Schritten: Zuerst wird der Zeitanteil (Stunden bis Nanosekunden) addiert. Ein Überlauf über Mitternacht wird dabei als ganze Tage übertragen. Danach wird der Datumsanteil (Jahre, Monate, Wochen, Tage) mit dem Kalender des Objekts addiert, beginnend mit der größten Einheit. Deshalb ergibt z. B. 31. Januar + 1 Monat standardmäßig den letzten Tag im Februar.
Weil PlainDateTime keine Zeitzone kennt, spielen Sommerzeit-Umstellungen keine Rolle: Ein Tag hat hier immer genau 24 Stunden. Das eignet sich für Kalender- und Planungslogik, etwa Wiederholungstermine zur „Wanduhrzeit“. Wenn es um echte vergangene Zeit an einem bestimmten Ort geht, nimmt man besser Temporal.ZonedDateTime.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $duration Pflicht | Temporal.Duration | object | string | Die Dauer, die addiert wird: eine Temporal.Duration, ein Objekt mit Eigenschaften wie years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds oder eine ISO-8601-Zeichenkette (z. B. "PT90M"). Die Umwandlung übernimmt Temporal.Duration.from(). |
|
| $options | object | {} | Optionales Einstellungsobjekt. |
| $options.overflow | "constrain" | "reject" | "constrain" | Legt fest, was bei einem ungültigen Datum passiert (z. B. 31. Februar). "constrain" setzt den Tag auf den nächsten gültigen Wert, "reject" wirft einen RangeError. |
Rückgabewert
Temporal.PlainDateTime im selben Kalender, verschoben um duration.Beispiele
Tage und Stunden addieren
const start = Temporal.PlainDateTime.from("2024-03-30T20:00");
// 10 Stunden gehen über Mitternacht hinaus
console.log(start.add({ hours: 10 }).toString());
// Objekt, ISO-Zeichenkette und Duration sind gleichwertig
console.log(start.add({ days: 1, hours: 2, minutes: 30 }).toString());
console.log(start.add("P1DT2H30M").toString());
console.log(start.add(Temporal.Duration.from({ weeks: 2 })).toString());
// Das Original bleibt unverändert
console.log(start.toString());
Monatsende: overflow constrain vs. reject
const termin = Temporal.PlainDateTime.from("2024-01-31T09:00");
// Standard: auf den letzten gültigen Tag begrenzen
console.log(termin.add({ months: 1 }).toString());
try {
termin.add({ months: 1 }, { overflow: "reject" });
} catch (err) {
console.log(err.name);
}
Wiederkehrende Termine erzeugen
const ersterTermin = Temporal.PlainDateTime.from("2025-06-02T10:30");
// Die nächsten vier wöchentlichen Meetings
const termine = Array.from({ length: 4 }, (_, i) =>
ersterTermin.add({ weeks: i }).toString()
);
console.log(termine);
Negative Dauer: in die Vergangenheit verschieben
const jetzt = Temporal.PlainDateTime.from("2025-01-01T00:15");
// Entspricht jetzt.subtract({ minutes: 30 })
console.log(jetzt.add({ minutes: -30 }).toString());
// Wichtig · Fallstricke
- Browserunterstützung: Temporal ist neu (Firefox 139+, Chrome/Edge 144+). Safari und ältere Node.js-Versionen haben es noch nicht. Als Ersatz dienen Polyfills wie
@js-temporal/polyfillodertemporal-polyfill. - Keine Zeitzone: Sommerzeit-Umstellungen werden ignoriert.
add({ hours: 24 })undadd({ days: 1 })ergeben hier immer dasselbe. BeiZonedDateTimegilt das nicht. - Addition ist nicht immer umkehrbar:
dt.add({ months: 1 }).subtract({ months: 1 })führt bei Monatsenden nicht unbedingt zum Ausgangswert zurück (31.01. → 29.02. → 29.01.). - Reihenfolge der Einheiten: Innerhalb einer Dauer wird zuerst der Zeitanteil addiert, danach der Datumsanteil von Jahren bis Tagen. Mehrere
add()-Aufrufe hintereinander können deshalb ein anderes Ergebnis liefern als ein einziger Aufruf mit der zusammengefassten Dauer. - Gemischte Vorzeichen in einer Dauer (z. B.
{ days: 1, hours: -2 }) sind nicht erlaubt und werfen einenRangeError. Das gilt auch für Ergebnisse außerhalb des gültigen Bereichs (etwa ±275.760 Jahre). - Einfache Zahlen wie
add(5)werden nicht akzeptiert und werfen einenTypeError. Die Einheit muss immer angegeben werden.