Signatur
Beschreibung
Die Zugriffseigenschaft monthsInYear gibt an, wie viele Monate das Jahr hat, in dem das Datum einer Temporal.ZonedDateTime-Instanz liegt. Ausschlaggebend ist dabei der Kalender der Instanz, nicht die Zeitzone. Die Zeitzone spielt nur indirekt eine Rolle: Sie bestimmt, auf welches lokale Datum ein Zeitpunkt fällt, und damit auch das Jahr.
Im Standardkalender iso8601 und im gregory-Kalender ist der Wert immer 12. Lunisolare Kalender wie hebrew, chinese oder dangi fügen in Schaltjahren einen zusätzlichen Monat ein. Dort liefert die Eigenschaft je nach Jahr 12 oder 13.
Die Eigenschaft ist nützlich, wenn du über alle Monate eines Jahres iterieren, den letzten Monat eines Jahres ermitteln (zdt.with({ month: zdt.monthsInYear })) oder Eingaben kalenderunabhängig prüfen willst. So vermeidest du fest einprogrammierte Annahmen wie „ein Jahr hat 12 Monate“.
Die Eigenschaft ist schreibgeschützt: Es gibt nur einen Getter, keinen Setter. Temporal-Objekte sind unveränderlich. Ein geändertes Datum erzeugst du mit with(), add() oder withCalendar().
Rückgabewert
12, in lunisolaren Kalendern 12 oder 13.Beispiele
ISO-Kalender: immer 12 Monate
const zdt = Temporal.ZonedDateTime.from("2024-03-15T10:00[Europe/Berlin]");
console.log(zdt.calendarId);
console.log(zdt.monthsInYear);
Hebräischer Kalender: Schaltjahr mit 13 Monaten
const leap = Temporal.ZonedDateTime.from("2024-03-15T10:00[Europe/Berlin][u-ca=hebrew]");
console.log(leap.year, leap.monthsInYear); // Jahr 5784 ist ein Schaltjahr
const common = Temporal.ZonedDateTime
.from("2025-03-15T10:00[Europe/Berlin]")
.withCalendar("hebrew");
console.log(common.year, common.monthsInYear); // Jahr 5785 ist ein Gemeinjahr
Letzten Monat des Jahres kalenderunabhängig ermitteln
const lastMonthOfYear = (zdt) =>
zdt.with({ month: zdt.monthsInYear, day: 1 });
const start = Temporal.ZonedDateTime.from("2024-03-15T09:30[Europe/Berlin][u-ca=hebrew]");
const last = lastMonthOfYear(start);
console.log(last.month, last.monthCode);
Alle Monate eines Jahres durchlaufen
const zdt = Temporal.ZonedDateTime.from("2024-06-01T00:00[Asia/Shanghai][u-ca=chinese]");
const monthCodes = [];
for (let m = 1; m <= zdt.monthsInYear; m++) {
monthCodes.push(zdt.with({ month: m, day: 1 }).monthCode);
}
console.log(zdt.monthsInYear, monthCodes.length);
// Wichtig · Fallstricke
- Browser-Kompatibilität: Temporal ist noch nicht Baseline. Nativ unterstützt wird es ab Firefox 139 und Chrome/Edge 144. Safari und ältere Node.js-Versionen brauchen einen Polyfill, z. B.
@js-temporal/polyfillodertemporal-polyfill. - Schreibgeschützt: Eine Zuweisung wie
zdt.monthsInYear = 13hat keine Wirkung. Im Strict Mode, also auch in ES-Modulen, löst sie einenTypeErroraus. - Monatsnummer ist nicht gleich Monatscode: In lunisolaren Schaltjahren verschieben sich die Monatsnummern. Im hebräischen Kalender hat Adar I den Code
M05L, danach haben die Monate eine um 1 höhere Nummer. Wenn du einen bestimmten Monat jahresübergreifend meinst, verwendemonthCodestattmonth. - Zeitzone beachten: Rund um Mitternacht zum Jahreswechsel kann derselbe Zeitpunkt (
Instant) in verschiedenen Zeitzonen in unterschiedliche Jahre fallen. In lunisolaren Kalendern kannmonthsInYeardann einen anderen Wert haben. - Die Kalenderdaten für nicht-ISO-Kalender stammen aus der Intl-/ICU-Unterstützung der Laufzeitumgebung. Bei Node.js-Builds mit
small-icukönnen einige Kalender fehlen.