Signatur
Beschreibung
Mit with() ersetzen Sie gezielt einzelne Bestandteile eines Kalenderdatums. Die übrigen Felder werden vom Ausgangsdatum übernommen. Weil Temporal.PlainDate unveränderlich ist, bleibt das ursprüngliche Objekt unverändert. Sie erhalten immer eine neue Instanz zurück.
Typische Anwendungen sind etwa „derselbe Tag in einem anderen Jahr“, „der Erste oder Letzte des Monats“ oder „Stichtag auf den 15. setzen“. Anders als add() rechnet with() nicht mit Zeitspannen, sondern überschreibt Felder. date.with({ month: 3 }) bedeutet also „März“ und nicht „drei Monate später“.
Die erkannten Felder hängen vom Kalender ab. Im ISO-8601-Kalender sind das year, month, monthCode und day. In Kalendern mit Epochen (z. B. gregory oder japanese) kommen era und eraYear hinzu. Führt die Kombination der Felder zu einem ungültigen Datum (z. B. 31. Februar), bestimmt die Option overflow, ob der Wert in den gültigen Bereich gezogen oder ein Fehler geworfen wird.
Kalender und Zeitzone lassen sich mit with() nicht ändern. Für einen Kalenderwechsel gibt es withCalendar(). Eine Uhrzeit ergänzen Sie mit toPlainDateTime().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $info Pflicht | object | Objekt mit mindestens einem erkannten Datumsfeld: year, month, monthCode, day sowie je nach Kalender era und eraYear. Die Eigenschaften calendar und timeZone sind nicht erlaubt. |
|
| $options | object | undefined | Optionales Objekt mit der Eigenschaft overflow: "constrain" (Standard, zieht ungültige Werte in den gültigen Bereich) oder "reject" (wirft einen RangeError). |
Rückgabewert
Temporal.PlainDate mit denselben Feldern wie das Ausgangsdatum, außer den in info angegebenen Feldern, die ersetzt werden. Der Kalender bleibt erhalten.Beispiele
Einzelne Felder ersetzen
const geburtstag = Temporal.PlainDate.from("1990-07-15");
// Derselbe Tag im Jahr 2025
const diesesJahr = geburtstag.with({ year: 2025 });
console.log(diesesJahr.toString());
// Das Original bleibt unverändert
console.log(geburtstag.toString());
Erster und letzter Tag des Monats
const heute = Temporal.PlainDate.from("2024-02-10");
const monatsanfang = heute.with({ day: 1 });
const monatsende = heute.with({ day: heute.daysInMonth });
console.log(monatsanfang.toString(), monatsende.toString());
Überlauf: constrain vs. reject
const datum = Temporal.PlainDate.from("2023-01-31");
// Standard "constrain": 31. Februar wird zum 28. Februar
console.log(datum.with({ month: 2 }).toString());
try {
datum.with({ month: 2 }, { overflow: "reject" });
} catch (err) {
console.log(err.constructor.name);
}
Fälligkeitsdatum auf den 15. des Folgemonats setzen
const rechnungsdatum = Temporal.PlainDate.from("2024-11-28");
// Erst einen Monat addieren (rechnen), dann den Tag ersetzen (with)
const faellig = rechnungsdatum.add({ months: 1 }).with({ day: 15 });
console.log(`Zahlbar bis ${faellig.toLocaleString("de-DE")}`);
// Wichtig · Fallstricke
- Kein Rechnen:
with({ month: date.month + 1 })schlägt im Dezember fehl, denn Monat 13 wird mitconstrainzu 12, mitrejectkommt einRangeError. Für relative Änderungen verwenden Sieadd()bzw.subtract(). - Ist
infokein Objekt oder enthält es kein erkanntes Feld, wird einTypeErrorgeworfen. Das gilt auch, wenncalendarodertimeZoneenthalten sind. - Geben Sie
monthundmonthCodegleichzeitig an und passen sie nicht zusammen, gibt es einenRangeError. In Kalendern mit Schaltmonaten (z. B.hebrewoderchinese) istmonthCodeeindeutiger alsmonth. - Auch mit
constrainwird einRangeErrorgeworfen, wenn das Ergebnis außerhalb des von Temporal unterstützten Datumsbereichs liegt (etwa ±270.000 Jahre). - Kompatibilität: Temporal ist neu und noch nicht in allen Engines verfügbar (z. B. Safari und ältere Node.js-Versionen). Für den produktiven Einsatz empfiehlt sich ein Polyfill wie
@js-temporal/polyfillodertemporal-polyfill.