Signatur
Beschreibung
since() berechnet, wie viel Zeit seit dem Jahr-Monat other bis zum aktuellen Objekt (this) vergangen ist. Liegt other vor this, ist die Dauer positiv, sonst negativ. Das Argument kann ein Temporal.PlainYearMonth, ein String wie "2021-02" oder ein Objekt wie { year: 2021, month: 2 } sein – also alles, was Temporal.PlainYearMonth.from() akzeptiert.
Da ein PlainYearMonth keinen Tag enthält, arbeitet die Methode nur mit den Einheiten Jahre und Monate. Standardmäßig wird das Ergebnis mit Jahren als größter Einheit ausgegeben (z. B. P3Y6M). Über largestUnit: "month" erhält man stattdessen die Gesamtzahl der Monate, über smallestUnit und roundingMode lässt sich das Ergebnis auf ganze Jahre runden.
Typische Einsatzfälle sind Laufzeiten von Verträgen und Abonnements, Betriebszugehörigkeit, Altersangaben in Monaten oder Abrechnungszeiträume – überall dort, wo Tage keine Rolle spielen. a.since(b) entspricht im Ergebnis weitgehend b.until(a); die Richtung wirkt sich aber auf das Runden aus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $other Pflicht | Temporal.PlainYearMonth | string | Object | Der Jahr-Monat, von dem aus gemessen wird. Wird wie bei Temporal.PlainYearMonth.from() umgewandelt. |
|
| $options | Object | {} | Optionales Objekt mit Einstellungen für Einheiten und Rundung (siehe folgende Einträge). |
| $options.largestUnit | "auto" | "year" | "month" (auch Plural) | "auto" (= "year") | Größte Einheit im Ergebnis. Mit "month" werden Jahre in Monate umgerechnet. |
| $options.smallestUnit | "year" | "month" (auch Plural) | "month" | Kleinste Einheit im Ergebnis; kleinere Anteile werden gerundet. Darf nicht größer als largestUnit sein. |
| $options.roundingIncrement | number | 1 | Rundungsschritt in smallestUnit, z. B. 3 für Quartale bei smallestUnit: "month". |
| $options.roundingMode | "ceil" | "floor" | "expand" | "trunc" | "halfCeil" | "halfFloor" | "halfExpand" | "halfTrunc" | "halfEven" | "trunc" | Rundungsmodus für den abgeschnittenen Rest. Standard ist Abschneiden Richtung null. |
Rückgabewert
Temporal.Duration, die nur years und months enthält. Sie ist positiv, wenn other vor this liegt, und negativ, wenn other danach liegt.Beispiele
Vertragslaufzeit in Jahren und Monaten
const vertragsbeginn = Temporal.PlainYearMonth.from("2021-02");
const heute = Temporal.PlainYearMonth.from("2024-08");
const laufzeit = heute.since(vertragsbeginn);
console.log(laufzeit.toString());
console.log(`${laufzeit.years} Jahre, ${laufzeit.months} Monate`);
// Umgekehrte Richtung ergibt eine negative Dauer
console.log(vertragsbeginn.since(heute).toString());
Gesamtzahl der Monate für eine Abrechnung
const abo = Temporal.PlainYearMonth.from({ year: 2022, month: 11 });
const aktuell = Temporal.PlainYearMonth.from("2025-03");
const monate = aktuell.since(abo, { largestUnit: "month" }).months;
const preisProMonat = 9.99;
console.log(`${monate} Monate × ${preisProMonat} € = ${(monate * preisProMonat).toFixed(2)} €`);
Auf ganze Jahre runden (Betriebszugehörigkeit)
const eintritt = Temporal.PlainYearMonth.from("2019-03");
const stichtag = Temporal.PlainYearMonth.from("2024-10");
// Standard: abschneiden
console.log(stichtag.since(eintritt, { smallestUnit: "year" }).toString());
// Kaufmännisch runden (ab 6 Monaten aufrunden)
console.log(
stichtag.since(eintritt, { smallestUnit: "year", roundingMode: "halfExpand" }).toString()
);
// String als Argument ist ebenfalls erlaubt
console.log(stichtag.since("2024-01").toString());
// Wichtig · Fallstricke
- Nur Jahre und Monate: Einheiten wie
"week","day"oder"hour"fürlargestUnit/smallestUnitwerfen einenRangeError. Wenn du Tage brauchst, wandle vorher mittoPlainDate({ day: 1 })um und nutzeTemporal.PlainDate.prototype.since(). - Kalender müssen übereinstimmen: Haben
thisundotherunterschiedliche Kalender (z. B.iso8601undhebrew), wird einRangeErrorgeworfen. - Richtung beachten:
a.since(b)misst vonbnacha. Wer die Reihenfolge vertauscht, bekommt ein negatives Ergebnis – prüfe gegebenenfallsduration.signoder nutzeduration.abs(). - Rundung: Standard ist
"trunc", also wird immer abgeschnitten. Bei negativen Dauern verhalten sich"floor"/"ceil"anders als"trunc"/"expand". - Kompatibilität: Temporal ist noch nicht in allen Browsern verfügbar (Safari fehlt bislang, ältere Chrome- und Node.js-Versionen ebenfalls). Für den produktiven Einsatz empfiehlt sich ein Polyfill wie
@js-temporal/polyfillodertemporal-polyfill.