Signatur
Beschreibung
Die Zugriffseigenschaft months liefert den Monatsanteil einer Temporal.Duration. Eine Dauer besteht aus zehn einzelnen Feldern (years, months, weeks, days, hours … nanoseconds). months gibt genau den Wert zurück, der beim Erzeugen der Dauer für Monate gesetzt wurde. Temporal rechnet diesen Wert nicht automatisch aus anderen Einheiten zusammen.
Deshalb liefert Temporal.Duration.from({ days: 60 }).months den Wert 0. Die Länge eines Monats hängt vom Kalender und vom Startdatum ab (28 bis 31 Tage). Tage lassen sich also nur mit einem Bezugsdatum in Monate umrechnen, etwa über round() mit relativeTo.
Die Eigenschaft ist nur lesbar. Um den Monatswert zu ändern, erzeugst du mit with({ months: … }) eine neue Dauer. Temporal.Duration-Objekte sind unveränderlich. Das Vorzeichen stimmt immer mit dem Vorzeichen der ganzen Dauer (sign) überein: Bei einer negativen Dauer ist months kleiner oder gleich 0.
Rückgabewert
0 zurück. Bei negativen Dauern ist der Wert negativ.Beispiele
Monate aus einer ISO-8601-Dauer auslesen
const laufzeit = Temporal.Duration.from('P1Y6M15D');
console.log(laufzeit.years); // 1
console.log(laufzeit.months); // 6
console.log(laufzeit.days); // 15
Keine automatische Umrechnung von Tagen in Monate
const d = Temporal.Duration.from({ days: 60 });
console.log(d.months); // 0 – Tage werden nicht umgerechnet
// Umrechnung nur mit Bezugsdatum möglich
const gerundet = d.round({
largestUnit: 'months',
relativeTo: Temporal.PlainDate.from('2024-01-01'),
});
console.log(gerundet.months, gerundet.days); // 1 30 (Januar 31 + Februar 29 Tage im Schaltjahr)
Vertragslaufzeit zwischen zwei Daten in Monaten
const beginn = Temporal.PlainDate.from('2023-03-15');
const ende = Temporal.PlainDate.from('2024-09-01');
const dauer = beginn.until(ende, { largestUnit: 'months' });
console.log(`${dauer.months} Monate und ${dauer.days} Tage`);
// Negative Dauer: Vorzeichen überträgt sich
console.log(dauer.negated().months);
Monatswert unveränderlich ersetzen
const abo = Temporal.Duration.from({ months: 3 });
const verlaengert = abo.with({ months: abo.months + 12 });
console.log(abo.months, verlaengert.months); // 3 15
console.log(verlaengert.toString()); // P15M
// Wichtig · Fallstricke
- Keine Normalisierung:
Temporal.Duration.from({ months: 15 }).monthsergibt15und nicht3Monate plus 1 Jahr. Wenn du in Jahre und Monate aufteilen willst, nutzeround({ largestUnit: 'years', relativeTo }). - Nur lesbar: Eine Zuweisung wie
d.months = 2ändert nichts; im strikten Modus löst sie einenTypeErroraus. Verwende stattdessenwith(). - Kalenderabhängig: Rechnungen mit Monaten, etwa
total({ unit: 'months' })oder Vergleiche mitTemporal.Duration.compare(), brauchen einerelativeTo-Option. Ohne sie wird einRangeErrorausgelöst. - Kompatibilität: Temporal wird erst von wenigen Browsern unterstützt (Firefox ab 139, Chromium ab 144). Safari und ältere Umgebungen brauchen ein Polyfill wie
@js-temporal/polyfillodertemporal-polyfill. Prüfe vorher mittypeof Temporal !== 'undefined', ob Temporal verfügbar ist.