Signatur
Beschreibung
since() gibt an, wie viel Zeit seit einem anderen Datum-Zeit-Wert bis zur aktuellen Instanz vergangen ist. Das Ergebnis ist ein Temporal.Duration-Objekt. Liegt other vor der Instanz, ist die Dauer positiv. Liegt es danach, ist sie negativ. Für other kannst du alles übergeben, was Temporal.PlainDateTime.from() akzeptiert, also eine Instanz, einen ISO-8601-String oder ein Objekt mit Feldern wie year, month und day.
Da ein PlainDateTime keine Zeitzone hat, rechnet since() mit einer „Wanduhr“-Zeit. Sommerzeitumstellungen werden also nicht berücksichtigt, und jeder Tag hat genau 24 Stunden. Das passt gut für Kalender- und Terminlogik ohne Ortsbezug. Wenn du echte vergangene Zeit an einem Ort messen willst, nimm Temporal.ZonedDateTime.prototype.since().
Mit den Optionen legst du fest, in welchen Einheiten die Dauer ausgegeben wird. Standardmäßig ist die größte Einheit "day". Monate und Jahre kommen im Ergebnis also nur vor, wenn du ausdrücklich largestUnit: "month" oder "year" angibst. Mit smallestUnit, roundingIncrement und roundingMode kannst du das Ergebnis runden, zum Beispiel auf volle Viertelstunden.
a.since(b) liefert im Wesentlichen dasselbe wie b.until(a). Die Rundungsrichtung wird dabei allerdings aus Sicht von this ausgewertet.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $other Pflicht | Temporal.PlainDateTime | string | object | Der Startzeitpunkt, von dem aus gemessen wird. Alles, was Temporal.PlainDateTime.from() akzeptiert. Muss denselben Kalender wie this verwenden. |
|
| $options | object | {} | Optionales Objekt mit folgenden Eigenschaften:
|
Rückgabewert
Temporal.Duration-Objekt mit der Dauer von other bis this. Es ist negativ, wenn other später liegt.Beispiele
Einfache Differenz in Tagen und Stunden
const ende = Temporal.PlainDateTime.from("2024-03-15T14:30");
const start = Temporal.PlainDateTime.from("2024-01-01T08:00");
const dauer = ende.since(start);
console.log(dauer.toString());
// Umgekehrte Richtung ergibt eine negative Dauer
console.log(start.since(ende).toString());
Größere Einheiten mit largestUnit
const ende = Temporal.PlainDateTime.from("2024-03-15T14:30");
const start = Temporal.PlainDateTime.from("2024-01-01T08:00");
// Monate statt Tage
console.log(ende.since(start, { largestUnit: "month" }).toString());
// Alles in Stunden ausdrücken
const inStunden = ende.since(start, { largestUnit: "hour" });
console.log(inStunden.hours, inStunden.minutes);
Arbeitszeit auf volle Viertelstunden runden
const beginn = Temporal.PlainDateTime.from("2024-05-06T08:07");
const feierabend = Temporal.PlainDateTime.from("2024-05-06T16:52");
const gerundet = feierabend.since(beginn, {
smallestUnit: "minute",
roundingIncrement: 15,
roundingMode: "halfExpand",
});
console.log(gerundet.toString());
console.log(`${gerundet.hours} h ${gerundet.minutes} min`);
Wie lange liegt ein Termin zurück?
const termin = Temporal.PlainDateTime.from({
year: 2024, month: 12, day: 24, hour: 18,
});
const jetzt = Temporal.Now.plainDateTimeISO();
const vergangen = jetzt.since(termin, { smallestUnit: "day" });
console.log(`Vor ${vergangen.days} Tagen`);
// Wichtig · Fallstricke
- Keine Zeitzone: Sommerzeitwechsel werden ignoriert. Zwischen
2024-03-31T01:00und03:00liegen hier immer 2 Stunden, auch wenn in Mitteleuropa real nur 1 Stunde vergeht. Für echte Zeitspannen an einem Ort nimmTemporal.ZonedDateTime. - Standard-Einheit ist Tag: Ohne
largestUnitkommen im Ergebnis keine Monate oder Jahre vor. Das ist Absicht, weil Monate unterschiedlich lang sind. - Gleicher Kalender nötig: Verwenden
thisundotherverschiedene Kalender, wird einRangeErrorgeworfen. Ungültige Optionen, etwasmallestUnitgrößer alslargestUnit, lösen ebenfalls einenRangeErroraus. - Rundung: Der Standard-Rundungsmodus
\"trunc\"schneidet Reste ab. Für kaufmännisches Runden gibroundingMode: \"halfExpand\"an. - Kompatibilität: Temporal ist noch nicht in allen Browsern verfügbar. Nativ unterstützt wird es ab Firefox 139 und Chrome 144, Safari und ältere Node.js-Versionen brauchen einen Polyfill wie
@js-temporal/polyfillodertemporal-polyfill.