Signatur
Beschreibung
Die schreibgeschützte Zugriffseigenschaft daysInMonth gibt an, wie viele Tage der Monat hat, in den das Datum einer Temporal.ZonedDateTime fällt. Im ISO-8601-Kalender ("iso8601") ist das 28, 29, 30 oder 31. Schaltjahre werden automatisch berücksichtigt.
Der Wert hängt vom Kalender der Instanz ab, nicht von der Zeitzone. In anderen Kalendern wie "hebrew", "islamic-umalqura" oder "chinese" kann der Monat andere Längen haben (z. B. 29 oder 30 Tage). Die Zeitzone ändert nur, welches lokale Datum zu einem bestimmten Zeitpunkt gilt. Deshalb kann derselbe Zeitpunkt in zwei Zeitzonen in unterschiedliche Monate fallen.
Typische Einsatzfälle sind Kalenderansichten, die Berechnung des letzten Tages im Monat (zdt.with({ day: zdt.daysInMonth })), das anteilige Abrechnen von Monatsbeträgen und das Prüfen von Tageseingaben.
Einen Setter gibt es nicht. Wenn du das Datum ändern willst, verwende with(), add() oder subtract(). Diese Methoden geben jeweils eine neue Instanz zurück.
Rückgabewert
Beispiele
Tage im Monat abfragen (inkl. Schaltjahr)
const feb2024 = Temporal.ZonedDateTime.from('2024-02-10T12:00[Europe/Berlin]');
const feb2025 = Temporal.ZonedDateTime.from('2025-02-10T12:00[Europe/Berlin]');
const april = Temporal.ZonedDateTime.from('2025-04-01T00:00[America/New_York]');
console.log(feb2024.daysInMonth); // Schaltjahr
console.log(feb2025.daysInMonth);
console.log(april.daysInMonth);
Letzten Tag des Monats bestimmen
const jetzt = Temporal.ZonedDateTime.from('2025-01-15T09:30[Europe/Berlin]');
// Auf den letzten Tag setzen, Uhrzeit auf Tagesende
const monatsende = jetzt.with({ day: jetzt.daysInMonth })
.withPlainTime({ hour: 23, minute: 59, second: 59 });
console.log(monatsende.toString());
Monatsbeitrag anteilig berechnen
const berechneAnteil = (start, monatsPreis) => {
const verbleibendeTage = start.daysInMonth - start.day + 1;
return Math.round((monatsPreis * verbleibendeTage / start.daysInMonth) * 100) / 100;
};
const beginn = Temporal.ZonedDateTime.from('2025-06-21T10:00[Europe/Vienna]');
console.log(berechneAnteil(beginn, 30)); // 10 von 30 Tagen
Zeitzone bestimmt den Monat, Kalender die Länge
const instant = Temporal.Instant.from('2025-01-31T23:30:00Z');
const london = instant.toZonedDateTimeISO('Europe/London');
const berlin = instant.toZonedDateTimeISO('Europe/Berlin');
console.log(london.month, london.daysInMonth); // noch Januar
console.log(berlin.month, berlin.daysInMonth); // schon Februar
const hebraeisch = berlin.withCalendar('hebrew');
console.log(hebraeisch.monthCode, hebraeisch.daysInMonth);
// Wichtig · Fallstricke
- Browser-Unterstützung: Temporal ist in Firefox ab Version 139 und in Chrome ab Version 144 verfügbar. Safari unterstützt es noch nicht. Für produktiven Einsatz empfiehlt sich ein Polyfill wie
@js-temporal/polyfillodertemporal-polyfill. Vor der Nutzung sollte man mittypeof Temporal !== 'undefined'prüfen, ob die API vorhanden ist. - Kalenderabhängig: Bei Nicht-ISO-Kalendern weicht der Wert von der gregorianischen Länge ab. Wer Monatslängen fest mit 28–31 annimmt, bekommt bei
withCalendar()falsche Ergebnisse. - Zeitzone beachten: Maßgeblich ist das lokale Datum in der Zeitzone der Instanz. Ein UTC-Zeitpunkt kurz vor Mitternacht kann lokal schon im nächsten Monat liegen.
- Nur lesbar: Eine Zuweisung wie
zdt.daysInMonth = 30ändert nichts; im Strict Mode löst sie einenTypeErroraus. Änderungen gehen überwith(). - Sommerzeit-Umstellungen beeinflussen die Anzahl der Stunden eines Tages (siehe
hoursInDay), aber nicht die Anzahl der Tage im Monat.