Start · Sprachen · JavaScript · Referenz · Temporal.ZonedDateTime.prototype.with()

Temporal.ZonedDateTime.prototype.with()

Methode

Gibt ein neues <code>Temporal.ZonedDateTime</code> zurück, in dem einzelne Felder wie Jahr, Tag, Stunde oder Offset durch neue Werte ersetzt sind.

seit JavaScript ES2026 (Temporal) – Firefox 139+, Chrome/Edge 144+ Kategorie: method-property

Signatur

Temporal.ZonedDateTime.prototype.with(info, options)

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:
  • disambiguation: "compatible" (Standard), "earlier", "later" oder "reject". Legt fest, was bei mehrdeutigen oder nicht existierenden Ortszeiten passiert.
  • offset: "prefer" (Standard), "use", "ignore" oder "reject". Legt fest, wie ein vorhandener oder übergebener Offset behandelt wird.
  • overflow: "constrain" (Standard) begrenzt ungültige Werte auf den gültigen Bereich. "reject" wirft dagegen einen RangeError.

Rückgabewert

Typ
Temporal.ZonedDateTime
Beschreibung
Ein neues 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
2024-07-01T09:00:00+02:00[Europe/Berlin] 2024-07-15T14:30:00+02:00[Europe/Berlin]

Ü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);
}
2023-02-28 RangeError

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());
2024-11-03T01:30:00-04:00[America/New_York] 2024-11-03T01:05:00-05:00[America/New_York]

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);
}
2024-03-31T03:30:00+02:00[Europe/Berlin] RangeError