Signatur
Beschreibung
getCalendars() liefert für eine Intl.Locale-Instanz die Kalender, die in dieser Region bzw. Sprache verwendet werden, z. B. "gregory", "japanese", "buddhist", "islamic-civil" oder "persian". Der erste Eintrag ist der bevorzugte Kalender der Locale. Die Daten stammen aus den CLDR-Daten der jeweiligen JavaScript-Engine.
Wenn der Locale-String bereits eine Unicode-Erweiterung -u-ca-… enthält oder im Konstruktor die Option calendar gesetzt wurde, enthält das Array nur diesen einen Kalender. Die Methode verrät also nicht nur, welche Kalender möglich sind, sondern auch, welcher gerade gilt.
Typische Einsatzfälle sind Kalenderauswahlen in Formularen, Datumspicker, die regionale Kalender anbieten, und die Vorbelegung der Option calendar bei Intl.DateTimeFormat. Die Methode gibt bei jedem Aufruf ein neues Array zurück. Du kannst es also gefahrlos verändern.
Rückgabewert
Intl.supportedValuesOf("calendar")). Die Einträge sind nach Gebräuchlichkeit absteigend sortiert. Ist -u-ca bzw. die Option calendar gesetzt, enthält das Array genau diesen einen Eintrag.Beispiele
Gebräuchliche Kalender verschiedener Regionen
const locales = ["de-DE", "ja-JP", "th-TH", "fa-IR"];
for (const tag of locales) {
const locale = new Intl.Locale(tag);
console.log(tag, locale.getCalendars());
}
Explizit gesetzter Kalender per Unicode-Erweiterung
const locale = new Intl.Locale("en-US-u-ca-buddhist");
console.log(locale.getCalendars());
console.log(locale.calendar);
// Gleiches Ergebnis über die Konstruktor-Option
const viaOption = new Intl.Locale("en-US", { calendar: "islamic-civil" });
console.log(viaOption.getCalendars());
Datum im bevorzugten Kalender formatieren (mit Feature-Erkennung)
const preferredCalendar = (tag) => {
const locale = new Intl.Locale(tag);
// Neuere Engines: Methode; ältere Chrome-Versionen: Getter "calendars"
const list = typeof locale.getCalendars === "function"
? locale.getCalendars()
: locale.calendars ?? ["gregory"];
return list[0];
};
const tag = "th-TH";
const calendar = preferredCalendar(tag);
const fmt = new Intl.DateTimeFormat(tag, { calendar, dateStyle: "long" });
console.log(calendar, fmt.format(new Date(2024, 0, 15)));
Kalender-Auswahl für ein Formular befüllen
const fillCalendarSelect = (select, tag) => {
const names = new Intl.DisplayNames(["de"], { type: "calendar" });
select.replaceChildren(
...new Intl.Locale(tag).getCalendars().map((id) => new Option(names.of(id), id))
);
};
fillCalendarSelect(document.querySelector("#calendar"), "ja-JP");
// Optionen: "Gregorianischer Kalender", "Japanischer Kalender"
// Wichtig · Fallstricke
- Umbenennung: Chrome/V8 hat diese Information zuerst als Getter
Intl.Locale.prototype.calendarsausgeliefert. Im Proposal wurde daraus die MethodegetCalendars(). In älteren Browsern gibt es eventuell nur den Getter. Prüfe deshalb per Feature-Erkennung (siehe Beispiel). - Browser-Unterstützung: Chrome/Edge 130+ und Safari 17+ unterstützen die Methode. Firefox unterstützt sie erst spät bzw. je nach Version nicht. Node.js hat sie ab den Versionen mit V8 13.0 (Node 23+).
- Datenabhängigkeit: Reihenfolge und Inhalt kommen aus der CLDR-Version der Engine und können sich zwischen Browsern und Versionen unterscheiden. Verlasse dich in Tests nicht auf exakte Arrays.
- Ohne Regionsangabe (z. B.
"ja") ergänzt die Engine intern die wahrscheinlichste Region (vergleichbar mitmaximize()). - Nicht mit
Intl.supportedValuesOf("calendar")verwechseln: Das liefert alle Kalender, die die Engine unterstützt, nicht nur die für eine bestimmte Locale.