Signatur
Beschreibung
withCalendar() wandelt ein Temporal.PlainDate in ein anderes Kalendersystem um. Der Tag selbst bleibt gleich, also dasselbe zugrunde liegende ISO-Datum. Es ändert sich nur, wie dieser Tag dargestellt wird: Eigenschaften wie year, month, monthCode, day, era oder daysInMonth werden nach den Regeln des neuen Kalenders berechnet.
Die Methode ist nützlich, wenn ein Datum in einem Kalender gespeichert oder berechnet wird, meist "iso8601", aber in einem regionalen Kalender angezeigt oder weiterverarbeitet werden soll. Dazu gehören etwa der hebräische Kalender für jüdische Feiertage, der japanische Kalender mit Ären oder "islamic-umalqura". Auch Datumsarithmetik mit add(), until() und ähnlichen Methoden folgt danach den Regeln des neuen Kalenders, z. B. bei Monatslängen und Schaltmonaten.
Wie alle Temporal-Objekte ist PlainDate unveränderlich. Die Methode gibt immer eine neue Instanz zurück, das Original bleibt unverändert. Das Kalenderfeld lässt sich nicht über with() ändern, dafür gibt es genau diese Methode.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $calendar Pflicht | string | Temporal.PlainDate | Temporal.PlainDateTime | Temporal.ZonedDateTime | Temporal.PlainYearMonth | Temporal.PlainMonthDay | Kalender-ID wie "iso8601", "gregory", "hebrew", "japanese", "chinese" oder "islamic-umalqura". Alternativ ein Temporal-Objekt, dessen Kalender übernommen wird. Groß- und Kleinschreibung spielt bei der ID keine Rolle. |
Rückgabewert
Temporal.PlainDate für dasselbe ISO-Datum, aber mit dem angegebenen Kalendersystem.Beispiele
ISO-Datum im hebräischen Kalender darstellen
const date = Temporal.PlainDate.from("2024-03-15");
const hebrew = date.withCalendar("hebrew");
console.log(hebrew.toString());
console.log(hebrew.year, hebrew.month, hebrew.monthCode, hebrew.day);
console.log(date.calendarId); // Original bleibt unverändert
Japanische Ära für ein Formular bestimmen
const birthday = Temporal.PlainDate.from("2024-03-15");
const jp = birthday.withCalendar("japanese");
console.log(`${jp.era} ${jp.eraYear}, Monat ${jp.month}, Tag ${jp.day}`);
Vergleich: gleicher Tag, verschiedene Kalender
const iso = Temporal.PlainDate.from("2024-03-15");
const hebrew = iso.withCalendar("hebrew");
// equals() berücksichtigt auch den Kalender
console.log(iso.equals(hebrew));
// compare() vergleicht nur die Position auf der Zeitachse
console.log(Temporal.PlainDate.compare(iso, hebrew));
// Zurück nach ISO
console.log(hebrew.withCalendar("iso8601").equals(iso));
Monatsarithmetik im Zielkalender
const start = Temporal.PlainDate.from("2024-03-15").withCalendar("hebrew");
// Ein hebräischer Monat später (nicht ein ISO-Monat!)
const next = start.add({ months: 1 });
console.log(next.withCalendar("iso8601").toString());
// Wichtig · Fallstricke
- Ungültige Eingaben: Eine unbekannte Kalender-ID löst einen
RangeErroraus. Andere Typen wie Zahlen oder normale Objekte lösen einenTypeErroraus. Fehlt das Argument, gibt es ebenfalls einenTypeError. with()ist kein Ersatz:date.with({ calendar: \"hebrew\" })funktioniert nicht und wirft einenTypeError. Nutze dafürwithCalendar().monthundmonthCodeunterscheiden sich: In Kalendern mit Schaltmonaten, etwa dem hebräischen oder chinesischen, istmonthnur die laufende Nummer im Jahr. Wenn du einen bestimmten Monat meinst, verwendemonthCode, z. B.\"M05L\"für Adar I.equals()undcompare()verhalten sich unterschiedlich:equals()liefertfalse, wenn sich die Kalender unterscheiden.Temporal.PlainDate.compare()vergleicht dagegen nur die ISO-Daten.- Welche Kalender verfügbar sind, hängt von der Engine ab: Die Liste richtet sich nach den ICU- bzw. Intl-Daten der Umgebung. Prüfen lässt sie sich mit
Intl.supportedValuesOf(\"calendar\"). - Kompatibilität: Temporal gibt es in Firefox ab Version 139 und in Chrome/Edge ab Version 144. Safari und ältere Node.js-Versionen unterstützen es noch nicht. Dort brauchst du einen Polyfill wie
@js-temporal/polyfillodertemporal-polyfill.