Signatur
Beschreibung
with() erzeugt eine geänderte Kopie eines Temporal.ZonedDateTime. Du übergibst ein Objekt mit den Feldern, die sich ändern sollen, z. B. { day: 1 } oder { hour: 0, minute: 0 }. Alle anderen Felder werden vom Ausgangsobjekt übernommen. Wie alle Temporal-Objekte ist ZonedDateTime unveränderlich: Das Original bleibt gleich, du bekommst immer eine neue Instanz zurück.
Die Methode ist gut geeignet, um Wanduhr-Zeiten gezielt zu setzen, etwa „Monatsanfang“, „heute um 9:00 Uhr“ oder „gleicher Tag im nächsten Jahr“. Anders als bei add() rechnest du nicht mit Zeitspannen, sondern setzt Kalender- und Uhrzeitfelder direkt auf absolute Werte.
Weil sich die Felder auf die Ortszeit in der Zeitzone beziehen, kann die neue Wanduhr-Zeit mehrdeutig sein (Rückstellung auf Winterzeit) oder gar nicht existieren (Sprung auf Sommerzeit). Wie damit umgegangen wird, steuerst du über die Optionen disambiguation und offset. Standardmäßig bleibt der bisherige Offset erhalten, wenn er zur neuen Zeit noch passt (offset: "prefer").
Zeitzone und Kalender lassen sich mit with() nicht ändern. Dafür gibt es withTimeZone() und withCalendar(). Um nur die Uhrzeit zu ersetzen, ist oft withPlainTime() praktischer.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $info Pflicht | Object | Objekt mit mindestens einem der Felder year, month, monthCode, day, era, eraYear, hour, minute, second, millisecond, microsecond, nanosecond und offset (String wie "+01:00"). calendar und timeZone sind nicht erlaubt. |
|
| $options | Object | undefined | Optionales Objekt mit diesen Einstellungen:
|
Rückgabewert
Temporal.ZonedDateTime mit den ersetzten Feldern und der gleichen Zeitzone und dem gleichen Kalender wie das Original.Beispiele
Einzelne Felder ersetzen
const termin = Temporal.ZonedDateTime.from("2024-07-15T14:30:00[Europe/Berlin]");
// Auf den Monatsanfang um 9:00 Uhr setzen
const monatsStart = termin.with({ day: 1, hour: 9, minute: 0 });
console.log(monatsStart.toString());
console.log(termin.toString()); // Original bleibt unverändert
Überlauf: constrain vs. reject
const ende = Temporal.ZonedDateTime.from("2023-01-31T12:00:00[Europe/Berlin]");
// Standard: der 31. Februar wird auf den 28. begrenzt
console.log(ende.with({ month: 2 }).toPlainDate().toString());
try {
ende.with({ month: 2 }, { overflow: "reject" });
} catch (err) {
console.log(err.name);
}
Mehrdeutige Zeit bei der Zeitumstellung
// 3. Nov. 2024: In New York gibt es 01:00–02:00 zweimal
const zdt = Temporal.ZonedDateTime.from("2024-11-03T01:05:00-04:00[America/New_York]");
// Der bisherige Offset (-04:00) bleibt erhalten (offset: "prefer")
console.log(zdt.with({ minute: 30 }).toString());
// Gezielt auf das zweite Vorkommen (Winterzeit) wechseln
console.log(zdt.with({ offset: "-05:00" }).toString());
Nicht existierende Zeit abweisen
const zdt = Temporal.ZonedDateTime.from("2024-03-31T01:30:00[Europe/Berlin]");
// 02:30 gibt es am Tag der Umstellung auf Sommerzeit nicht
console.log(zdt.with({ hour: 2 }).toString()); // compatible: wird nach vorn verschoben
try {
zdt.with({ hour: 2 }, { disambiguation: "reject" });
} catch (err) {
console.log(err.name);
}