Signatur
Beschreibung
with() erzeugt eine Kopie eines Temporal.PlainDateTime, in der nur die angegebenen Felder geändert sind. Alle anderen Felder wie Jahr, Monat, Tag, Stunde oder Minute werden unverändert übernommen. Da Temporal-Objekte unveränderlich sind, ändert die Methode nie das ursprüngliche Objekt, sondern gibt immer eine neue Instanz zurück.
Die Methode eignet sich für absolute Änderungen wie „auf den 1. des Monats setzen“, „auf 9:00 Uhr setzen“ oder „auf den letzten Tag des Monats setzen“. Für relative Änderungen („3 Tage später“) sind add() und subtract() gedacht.
Die Felder werden im Kalender der Instanz ausgewertet. Den Kalender selbst kann with() nicht ändern, dafür gibt es withCalendar(). Um die komplette Uhrzeit zu ersetzen, ist withPlainTime() oft kürzer.
Mit der Option overflow legst du fest, was bei ungültigen Kombinationen wie dem 31. Februar passiert: Bei "constrain" (Standard) wird der Wert auf den nächsten gültigen Wert gekürzt, bei "reject" wird ein RangeError geworfen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $info Pflicht | Object | Objekt mit mindestens einem der Felder year, month, monthCode, day, era/eraYear (je nach Kalender), hour, minute, second, millisecond, microsecond, nanosecond. Die Felder calendar und timeZone sind nicht erlaubt. |
|
| $options | Object | undefined | Optionales Einstellungsobjekt. |
| $options.overflow | "constrain" | "reject" | "constrain" | Verhalten bei Werten außerhalb des gültigen Bereichs: "constrain" kürzt auf den nächsten gültigen Wert, "reject" wirft einen RangeError. |
Rückgabewert
Temporal.PlainDateTime mit den ersetzten Feldern. Das ursprüngliche Objekt bleibt unverändert.Beispiele
Einzelne Felder ersetzen
const termin = Temporal.PlainDateTime.from("2025-07-06T15:30:00");
// Nur die Stunde ändern – Datum und Minuten bleiben
const morgens = termin.with({ hour: 9 });
console.log(morgens.toString());
// Mehrere Felder gleichzeitig ändern
const ersterDesMonats = termin.with({ day: 1, hour: 0, minute: 0 });
console.log(ersterDesMonats.toString());
// Das Original ist unverändert
console.log(termin.toString());
Monatsende berechnen und auf Tagesbeginn setzen
const jetzt = Temporal.PlainDateTime.from("2024-02-10T14:45:12.5");
// Letzter Tag des Monats, 23:59:59
const monatsende = jetzt.with({
day: jetzt.daysInMonth,
hour: 23,
minute: 59,
second: 59,
millisecond: 0
});
console.log(monatsende.toString());
// Beginn des Tages (Alternative: jetzt.withPlainTime())
const tagesbeginn = jetzt.with({
hour: 0, minute: 0, second: 0,
millisecond: 0, microsecond: 0, nanosecond: 0
});
console.log(tagesbeginn.toString());
Überlauf: constrain vs. reject
const dt = Temporal.PlainDateTime.from("2024-01-31T12:00");
// Standard "constrain": 31. Februar wird auf den 29. gekürzt (Schaltjahr)
console.log(dt.with({ month: 2 }).toString());
// "reject": ungültiges Datum führt zu einem Fehler
try {
dt.with({ month: 2 }, { overflow: "reject" });
} catch (err) {
console.log(err.constructor.name);
}
// Wichtig · Fallstricke
- Keine relative Änderung:
with({ day: dt.day + 40 })läuft nicht in den nächsten Monat über. Mit"constrain"wird der Tag stillschweigend auf den Monatsletzten gekürzt. Für Rechnungen solltest duadd()/subtract()verwenden. - Ein leeres Objekt oder ein Objekt ohne bekanntes Feld führt zu einem
TypeError. Das gilt auch für Objekte mitcalendarodertimeZoneund für Temporal-Objekte alsinfo. monthundmonthCodedürfen nicht widersprüchlich sein. Sonst wird einRangeErrorgeworfen. In Kalendern mit Schaltmonaten (z. B. dem hebräischen) istmonthCodeeindeutiger.- Unbekannte Felder werden stillschweigend ignoriert. Ein Tippfehler wie
{ hours: 9 }ändert also nichts und wirft nur dann einen Fehler, wenn sonst kein gültiges Feld enthalten ist. - Kompatibilität: Temporal ist erst in neueren Browsern verfügbar (Firefox 139+, Chrome/Edge 144+). Für Safari und ältere Umgebungen gibt es einen Polyfill, z. B.
@js-temporal/polyfillodertemporal-polyfill.