Signatur
Beschreibung
calendarId ist eine schreibgeschützte Zugriffseigenschaft (Getter) von Temporal.ZonedDateTime-Instanzen. Ein ZonedDateTime speichert seinen Zeitpunkt intern immer im ISO-8601-Kalender. Der zugeordnete Kalender bestimmt aber, wie die Werte von Eigenschaften wie year, month, monthCode, day, era oder eraYear berechnet werden. Außerdem legt er fest, wie Datumsberechnungen mit add(), subtract() oder until() ablaufen.
Der Rückgabewert ist ein kanonischer, kleingeschriebener Kalenderbezeichner aus dem Unicode-/CLDR-Standard, zum Beispiel "iso8601", "gregory", "japanese", "hebrew", "islamic-umalqura" oder "buddhist". Wenn du beim Erzeugen keinen Kalender angibst, ist der Wert "iso8601".
Die Eigenschaft ist nützlich, wenn du prüfen willst, ob ein Datum aus einer Benutzereingabe oder einer serialisierten Zeichenkette (Annotation [u-ca=…]) in einem bestimmten Kalender vorliegt. Du brauchst sie auch, um Kalender vor Vergleichen oder Berechnungen anzugleichen oder um Kalenderinformationen für die Anzeige zu protokollieren. Zum Ändern des Kalenders verwendest du withCalendar(), denn calendarId hat keinen Setter.
Rückgabewert
"iso8601", "gregory" oder "japanese". Ohne ausdrückliche Angabe ist er immer "iso8601".Beispiele
Standardkalender eines ZonedDateTime abfragen
const termin = Temporal.ZonedDateTime.from("2024-03-15T10:30:00[Europe/Berlin]");
console.log(termin.calendarId);
Kalender aus einer Zeichenkette mit u-ca-Annotation lesen
const zdt = Temporal.ZonedDateTime.from(
"2024-03-15T10:30:00+09:00[Asia/Tokyo][u-ca=japanese]"
);
console.log(zdt.calendarId);
console.log(zdt.era, zdt.eraYear); // Ära-Angaben hängen vom Kalender ab
Kalender wechseln und vor dem Vergleich angleichen
const a = Temporal.ZonedDateTime.from("2024-09-01T12:00:00[Europe/Berlin]");
const b = a.withCalendar("hebrew");
console.log(b.calendarId); // "hebrew"
console.log(a.equals(b)); // false – equals() prüft auch den Kalender
// Vor dem Vergleich auf denselben Kalender bringen
const gleich = a.equals(b.withCalendar(a.calendarId));
console.log(gleich);
Eingaben auf ISO-Kalender normalisieren
const normalisieren = (zdt) =>
zdt.calendarId === "iso8601" ? zdt : zdt.withCalendar("iso8601");
const eingabe = Temporal.ZonedDateTime.from(
"2024-05-01T08:00:00+07:00[Asia/Bangkok][u-ca=buddhist]"
);
console.log(eingabe.year); // 2567 (buddhistische Zählung)
console.log(normalisieren(eingabe).year); // 2024
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
calendarIdhat keine Wirkung und wirft im Strict Mode einenTypeError. Zum Wechseln des Kalenders verwendest duwithCalendar(id), das eine neue Instanz zurückgibt. - Kanonisierung: IDs werden kleingeschrieben und kanonisiert. Veraltete Aliase werden auf die kanonische Form abgebildet, z. B.
"islamicc"→"islamic-civil". Vergleiche deshalb immer mit dem Wert voncalendarIdund nicht mit der ursprünglichen Eingabe. "iso8601"≠"gregory": Beide ergeben in der Regel dieselben Jahr-, Monats- und Tageswerte. Der gregorianische Kalender kennt aber Ären (era/eraYear), der ISO-Kalender nicht.equals()gibt bei unterschiedlichen Kalendernfalsezurück.- Serialisierung:
toString()hängt die Annotation[u-ca=…]standardmäßig nur bei Kalendern an, die nicht ISO sind. Mit der OptioncalendarName("always","never","critical") lässt sich das steuern. - Kompatibilität: Temporal ist noch nicht in allen Engines verfügbar (Firefox 139+, Chrome/Edge 144+, Safari/Node.js teils noch ohne Unterstützung). Für den produktiven Einsatz empfiehlt sich ein Polyfill wie
@js-temporal/polyfillodertemporal-polyfill. Welche Kalender außer"iso8601"unterstützt werden, hängt von den Intl-Daten der Engine ab.