Start · Sprachen · JavaScript · Referenz · Temporal.Duration.prototype.months

Temporal.Duration.prototype.months

Eigenschaft

Gibt die Anzahl der Monate einer <code>Temporal.Duration</code> als ganze Zahl zurück. Die Zahl kann negativ sein, wenn die Dauer negativ ist.

seit JavaScript ES2026 (Temporal); Firefox 139+, Chrome 144+, sons Kategorie: method-property

Signatur

get Temporal.Duration.prototype.months

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

Typ
number
Beschreibung
Eine ganze Zahl (nie mit Nachkommastellen) für die Monate in der Dauer. Ist das Feld nicht gesetzt, kommt 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
1 6 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)
0 1 30

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);
17 Monate und 17 Tage -17

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
3 15 P15M

// Wichtig · Fallstricke

  • Keine Normalisierung: Temporal.Duration.from({ months: 15 }).months ergibt 15 und nicht 3 Monate plus 1 Jahr. Wenn du in Jahre und Monate aufteilen willst, nutze round({ largestUnit: 'years', relativeTo }).
  • Nur lesbar: Eine Zuweisung wie d.months = 2 ändert nichts; im strikten Modus löst sie einen TypeError aus. Verwende stattdessen with().
  • Kalenderabhängig: Rechnungen mit Monaten, etwa total({ unit: 'months' }) oder Vergleiche mit Temporal.Duration.compare(), brauchen eine relativeTo-Option. Ohne sie wird ein RangeError ausgelö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/polyfill oder temporal-polyfill. Prüfe vorher mit typeof Temporal !== 'undefined', ob Temporal verfügbar ist.