Signatur
Beschreibung
Die Methode since() berechnet den Abstand zwischen zwei Kalenderdaten ohne Uhrzeit und Zeitzone. Das Ergebnis ist this − other: Liegt other in der Vergangenheit, ist die Dauer positiv, liegt es in der Zukunft, ist sie negativ. Damit ist since() das Gegenstück zu until(): a.since(b) entspricht b.until(a).
Mit other kannst du eine Temporal.PlainDate-Instanz, einen ISO-8601-String wie "2024-01-01" oder ein Objekt mit year, month und day übergeben. Die Umwandlung übernimmt Temporal.PlainDate.from().
Ohne Optionen wird die Differenz nur in Tagen angegeben (largestUnit: "auto" entspricht hier "day"). Für Altersangaben, Vertragslaufzeiten oder „vor X Monaten“-Anzeigen setzt du largestUnit auf "year" oder "month". Die Berechnung folgt dem Kalender: Unterschiedliche Monatslängen und Schaltjahre werden automatisch berücksichtigt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $other Pflicht | Temporal.PlainDate | string | object | Das Startdatum, ab dem gemessen wird. Wird mit Temporal.PlainDate.from() umgewandelt. |
|
| $options | object | {} | Optionales Objekt mit folgenden Einstellungen:
"months". |
Rückgabewert
Temporal.Duration vom Datum other bis zu this. Sie ist positiv, wenn other früher liegt, und negativ, wenn es später liegt. Die Dauer enthält nur Datumsanteile (Jahre, Monate, Wochen, Tage).Beispiele
Tage seit Jahresbeginn (Standardverhalten)
const heute = Temporal.PlainDate.from("2024-03-15");
const neujahr = Temporal.PlainDate.from("2024-01-01");
const dauer = heute.since(neujahr);
console.log(dauer.toString());
console.log(dauer.days);
// Umgekehrte Richtung ergibt eine negative Dauer
console.log(neujahr.since(heute).toString());
Alter in Jahren, Monaten und Tagen berechnen
const geburtstag = Temporal.PlainDate.from("1990-08-20");
const stichtag = Temporal.PlainDate.from("2025-06-10");
const alter = stichtag.since(geburtstag, { largestUnit: "year" });
console.log(alter.toString());
console.log(`${alter.years} Jahre, ${alter.months} Monate, ${alter.days} Tage`);
Strings als Argument und Ergebnis in Monaten
const ende = Temporal.PlainDate.from("2024-03-15");
// other darf auch ein ISO-String sein
console.log(ende.since("2024-01-01", { largestUnit: "month" }).toString());
// Auf ganze Monate runden statt abschneiden
const gerundet = ende.since("2024-01-01", {
largestUnit: "month",
smallestUnit: "month",
roundingMode: "halfExpand",
});
console.log(gerundet.toString());
Relative Anzeige mit Intl.RelativeTimeFormat
const erstellt = Temporal.PlainDate.from("2024-11-02");
const heute = Temporal.PlainDate.from("2024-12-24");
const wochen = heute.since(erstellt, { largestUnit: "week" }).weeks;
const rtf = new Intl.RelativeTimeFormat("de", { numeric: "auto" });
console.log(rtf.format(-wochen, "week"));
// Wichtig · Fallstricke
- Richtung:
a.since(b)berechneta − b. Wenn du die Differenz vom aktuellen Objekt in die Zukunft suchst, istuntil()meist verständlicher. - Standard nur Tage: Ohne
largestUniterhältst du z. B.P74Dund nichtP2M14D.duration.monthsist dann0. - Standard-Rundung ist
"trunc": MitsmallestUnit: "month"wird ohne weitere Angabe abgeschnitten und nicht kaufmännisch gerundet. - Keine Zeiteinheiten:
"hour","minute"usw. lösen einenRangeErroraus. Für Uhrzeiten brauchst duPlainDateTimeoderZonedDateTime. - Ist
largestUnitkleiner alssmallestUnit, entsteht einRangeError. - Haben beide Daten verschiedene Kalender (z. B.
iso8601undhebrew), wird einRangeErrorgeworfen. - Monatsarithmetik ist nicht symmetrisch: Durch unterschiedliche Monatslängen führt das Zurückrechnen einer Dauer nicht immer zum Ausgangsdatum.
- Kompatibilität: Temporal gibt es erst seit Kurzem in Firefox (139+) und Chrome (144+). Für andere Browser und ältere Node.js-Versionen brauchst du einen Polyfill wie
@js-temporal/polyfillodertemporal-polyfill.