Start · Sprachen · JavaScript · Referenz · Intl.Locale.prototype.getCalendars()

Intl.Locale.prototype.getCalendars()

Methode

Gibt ein Array der Kalender-Kennungen zurück, die für die Locale gebräuchlich sind. Die Einträge sind nach Präferenz absteigend sortiert.

seit JavaScript Proposal „Intl Locale Info“ (Stufe 3); Chrome 130+ Kategorie: method-property

Signatur

Intl.Locale.prototype.getCalendars()

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

Typ
string[]
Beschreibung
Ein Array mit einer oder mehreren eindeutigen Kalender-Kennungen (siehe 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());
}
de-DE [ 'gregory' ] ja-JP [ 'gregory', 'japanese' ] th-TH [ 'buddhist', 'gregory' ] fa-IR [ 'persian', 'gregory', 'islamic', 'islamic-civil', 'islamic-tbla' ]

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());
[ 'buddhist' ] buddhist [ 'islamic-civil' ]

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)));
buddhist 15 มกราคม 2567

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.calendars ausgeliefert. Im Proposal wurde daraus die Methode getCalendars(). 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 mit maximize()).
  • Nicht mit Intl.supportedValuesOf("calendar") verwechseln: Das liefert alle Kalender, die die Engine unterstützt, nicht nur die für eine bestimmte Locale.