Start · Sprachen · JavaScript · Referenz · Temporal.Duration.prototype.abs()

Temporal.Duration.prototype.abs()

Methode

Gibt eine neue <code>Temporal.Duration</code> mit denselben Feldbeträgen, aber positivem Vorzeichen zurück, also den Absolutwert der Dauer.

seit JavaScript ES2026 (Temporal); Firefox 139+, Chrome/Edge 144+, Kategorie: method-property

Signatur

Temporal.Duration.prototype.abs()

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

Typ
Temporal.Duration
Beschreibung
Eine neue 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
-PT2H30M PT2H30M -PT2H30M

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`);
-P46D Abstand: 46 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()));
vor 5 Stunden in 3 Stunden jetzt

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());
PT90M PT1H30M

// 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 mit typeof Temporal !== 'undefined'.
  • abs() gleicht die Felder nicht aus: -PT90M wird zu PT90M. Für eine umgerechnete Darstellung nimmst du round({ largestUnit }).
  • Die Methode ändert nie das Original, weil Temporal.Duration unverä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 === -1 bzw. duration.blank für eine Nulldauer. Dafür musst du nicht erst abs() aufrufen und vergleichen.
  • Das Gegenstück zum Umdrehen des Vorzeichens ist negated(): Es dreht das Vorzeichen immer um, abs() dagegen nur bei negativen Dauern.