Start · Sprachen · JavaScript · Referenz · Temporal.PlainDateTime.prototype.since()

Temporal.PlainDateTime.prototype.since()

Methode

Berechnet die Dauer von <code>other</code> bis zu diesem <code>Temporal.PlainDateTime</code> und gibt sie als <code>Temporal.Duration</code> zurück (<code>this − other</code>).

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

Signatur

Temporal.PlainDateTime.prototype.since(other, options)

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:
  • largestUnit: größte Einheit im Ergebnis ("year", "month", "week", "day", "hour" … "nanosecond" oder "auto"). Standard: "auto", entspricht "day" bzw. smallestUnit, falls diese größer ist.
  • smallestUnit: kleinste Einheit im Ergebnis. Standard: "nanosecond", es wird also nicht gerundet.
  • roundingIncrement: Rundungsschritt in smallestUnit, z. B. 15 bei Minuten. Standard: 1.
  • roundingMode: z. B. "trunc", "floor", "ceil", "halfExpand". Standard: "trunc".

Rückgabewert

Typ
Temporal.Duration
Beschreibung
Ein neues 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());
P74DT6H30M -P74DT6H30M

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);
P2M14DT6H30M 1782 30

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`);
PT8H45M 8 h 45 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`);
Vor … Tagen (abhängig vom aktuellen Datum)

// Wichtig · Fallstricke

  • Keine Zeitzone: Sommerzeitwechsel werden ignoriert. Zwischen 2024-03-31T01:00 und 03:00 liegen hier immer 2 Stunden, auch wenn in Mitteleuropa real nur 1 Stunde vergeht. Für echte Zeitspannen an einem Ort nimm Temporal.ZonedDateTime.
  • Standard-Einheit ist Tag: Ohne largestUnit kommen im Ergebnis keine Monate oder Jahre vor. Das ist Absicht, weil Monate unterschiedlich lang sind.
  • Gleicher Kalender nötig: Verwenden this und other verschiedene Kalender, wird ein RangeError geworfen. Ungültige Optionen, etwa smallestUnit größer als largestUnit, lösen ebenfalls einen RangeError aus.
  • Rundung: Der Standard-Rundungsmodus \"trunc\" schneidet Reste ab. Für kaufmännisches Runden gib roundingMode: \"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/polyfill oder temporal-polyfill.