Signatur
Beschreibung
Die Methode abs() liefert eine neue Temporal.Duration, deren Felder (years, months, weeks, days, hours … nanoseconds) dieselben Beträge wie das Original haben. Ein negatives Vorzeichen fällt dabei weg. Ist die Dauer schon positiv oder null, bekommst du eine gleichwertige Kopie zurück.
Eine Temporal.Duration kann keine gemischten Vorzeichen haben: Entweder sind alle Felder ≥ 0 oder alle ≤ 0. Deshalb ist abs() eindeutig und dreht nur das gemeinsame Vorzeichen um, falls es negativ ist. Die Felder werden dabei nicht ausgeglichen oder umgerechnet. Aus -PT90M wird also PT90M und nicht PT1H30M.
Praktisch ist abs() vor allem, wenn du nur wissen willst, wie weit zwei Zeitpunkte auseinanderliegen, und die Richtung egal ist. Das gilt etwa für Ergebnisse von since() oder until(), bei denen die Reihenfolge der Argumente unklar ist, und für Anzeigen wie „vor 3 Tagen“ bzw. „in 3 Tagen“, bei denen du den Betrag getrennt vom Vorzeichen (duration.sign) formatierst.
Wie alle Temporal-Objekte ist Temporal.Duration unveränderlich. abs() ändert also nie das Original, sondern gibt immer ein neues Objekt zurück.
Rückgabewert
Temporal.Duration mit denselben Feldbeträgen und dem Vorzeichen 1 (bzw. 0 bei einer Nulldauer).Beispiele
Negative Dauer in eine positive umwandeln
const rueckstand = Temporal.Duration.from({ hours: -2, minutes: -30 });
console.log(rueckstand.toString());
console.log(rueckstand.abs().toString());
console.log(rueckstand.toString()); // Original bleibt unverändert
Abstand zwischen zwei Daten unabhängig von der Reihenfolge
const start = Temporal.PlainDate.from('2024-03-01');
const ende = Temporal.PlainDate.from('2024-01-15');
// ende liegt vor start, daher ist das Ergebnis negativ
const diff = ende.since(start);
console.log(diff.toString());
const abstand = diff.abs();
console.log(`Abstand: ${abstand.days} Tage`);
Relative Zeitangabe mit sign und abs()
const relativ = (dauer) => {
const betrag = dauer.abs().total({ unit: 'hours' });
if (dauer.sign === 0) return 'jetzt';
return dauer.sign < 0 ? `vor ${betrag} Stunden` : `in ${betrag} Stunden`;
};
console.log(relativ(Temporal.Duration.from({ hours: -5 })));
console.log(relativ(Temporal.Duration.from({ hours: 3 })));
console.log(relativ(new Temporal.Duration()));
Felder werden nicht ausgeglichen
const d = Temporal.Duration.from({ minutes: -90 });
console.log(d.abs().toString());
// Für eine ausgeglichene Darstellung zusätzlich round() verwenden
console.log(d.abs().round({ largestUnit: 'hours' }).toString());
// Wichtig · Fallstricke
- Browser-Unterstützung: Temporal ist neu. Es läuft in Firefox ab Version 139 und in Chromium-basierten Browsern ab Version 144. Safari und ältere Umgebungen brauchen noch einen Polyfill wie
@js-temporal/polyfill. Prüfe vorher mittypeof Temporal !== 'undefined'. abs()gleicht die Felder nicht aus:-PT90Mwird zuPT90M. Für eine umgerechnete Darstellung nimmst duround({ largestUnit }).- Die Methode ändert nie das Original, weil
Temporal.Durationunveränderlich ist. Du musst den Rückgabewert also einer Variablen zuweisen. - Willst du nur prüfen, ob eine Dauer negativ ist, genügt
duration.sign === -1bzw.duration.blankfür eine Nulldauer. Dafür musst du nicht erstabs()aufrufen und vergleichen. - Das Gegenstück zum Umdrehen des Vorzeichens ist
negated(): Es dreht das Vorzeichen immer um,abs()dagegen nur bei negativen Dauern.