Signatur
Beschreibung
since() berechnet, wie viel Zeit zwischen einem anderen Zeitpunkt und der aktuellen Instanz liegt. Das Ergebnis ist ein neues Temporal.Duration-Objekt. Liegt other vor this, ist die Dauer positiv, liegt es danach, ist sie negativ. Die Methode ist das Gegenstück zu until(): a.since(b) ergibt ohne Rundung dasselbe wie b.until(a).
Für other nimmt die Methode alles an, was auch Temporal.ZonedDateTime.from() akzeptiert: eine ZonedDateTime-Instanz, ein Objekt mit Feldern oder eine Zeichenkette wie "2024-03-01T09:00[Europe/Berlin]". Beide Werte müssen denselben Kalender verwenden.
Standardmäßig ist largestUnit gleich "hour". Das Ergebnis wird also in Stunden, Minuten, Sekunden usw. angegeben und nicht in Tagen. So bleibt es eindeutig, auch wenn dazwischen eine Zeitumstellung liegt. Wer Tage, Monate oder Jahre braucht, setzt largestUnit ausdrücklich. Dann rechnet Temporal mit Kalendertagen, die je nach Zeitumstellung 23 oder 25 Stunden lang sein können. In diesem Fall müssen beide Werte dieselbe Zeitzone haben.
Typische Einsätze sind Countdowns, Anzeigen wie „vor X Stunden“, Arbeitszeitberechnung, Altersangaben und die Frage, wie lange ein Ereignis zurückliegt. Mit smallestUnit, roundingIncrement und roundingMode lässt sich das Ergebnis direkt passend runden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $other Pflicht | Temporal.ZonedDateTime | object | string | Der Vergleichszeitpunkt, der von this abgezogen wird. Wird bei Bedarf wie mit Temporal.ZonedDateTime.from() umgewandelt. |
|
| $options | object | {} | Optionales Objekt mit Einstellungen zu Einheiten und Rundung (siehe unten). |
| $options.largestUnit | string | "hour" | Größte Einheit im Ergebnis: "year", "month", "week", "day", "hour" … "nanosecond" oder "auto". Ab "day" aufwärts müssen die Zeitzonen übereinstimmen. |
| $options.smallestUnit | string | "nanosecond" | Kleinste Einheit im Ergebnis. Kleinere Anteile werden gerundet. |
| $options.roundingIncrement | number | 1 | Schrittweite beim Runden, bezogen auf smallestUnit (z. B. 15 bei Minuten). |
| $options.roundingMode | string | "trunc" | Rundungsmodus: "trunc", "floor", "ceil", "expand", "halfExpand", "halfTrunc", "halfEven", "halfCeil", "halfFloor". |
Rückgabewert
Temporal.Duration für this − other. Sie ist positiv, wenn other früher liegt, und negativ, wenn es später liegt.Beispiele
Arbeitszeit eines Tages berechnen
const start = Temporal.ZonedDateTime.from('2024-03-01T09:00[Europe/Berlin]');
const ende = Temporal.ZonedDateTime.from('2024-03-01T17:30[Europe/Berlin]');
const dauer = ende.since(start);
console.log(dauer.toString());
console.log(`${dauer.hours} h ${dauer.minutes} min`);
// Umgekehrt: negative Dauer
console.log(start.since(ende).toString());
Zeitumstellung: Stunden gegenüber Kalendertagen
// In der Nacht zum 31.03.2024 wird in Berlin auf Sommerzeit umgestellt
const vorher = Temporal.ZonedDateTime.from('2024-03-30T12:00[Europe/Berlin]');
const nachher = Temporal.ZonedDateTime.from('2024-03-31T12:00[Europe/Berlin]');
console.log(nachher.since(vorher).toString()); // Standard: Stunden
console.log(nachher.since(vorher, { largestUnit: 'day' }).toString()); // Kalendertag
„vor X Stunden“-Anzeige mit Rundung
const jetzt = Temporal.ZonedDateTime.from('2024-06-15T14:45:20+02:00[Europe/Berlin]');
const beitrag = Temporal.ZonedDateTime.from('2024-06-15T11:10:00+02:00[Europe/Berlin]');
const vergangen = jetzt.since(beitrag, { smallestUnit: 'hour' });
const rtf = new Intl.RelativeTimeFormat('de', { numeric: 'auto' });
console.log(jetzt.since(beitrag).toString());
console.log(rtf.format(-vergangen.hours, 'hour'));
Alter in Jahren, Monaten und Tagen
const geburt = Temporal.ZonedDateTime.from('1990-08-20T08:15[Europe/Berlin]');
const heute = Temporal.ZonedDateTime.from('2024-06-15T14:45[Europe/Berlin]');
const alter = heute.since(geburt, { largestUnit: 'year', smallestUnit: 'day' });
console.log(alter.toString());
console.log(`${alter.years} Jahre, ${alter.months} Monate, ${alter.days} Tage`);