Signatur
Beschreibung
Die Methode toJSON() von Temporal.Duration-Instanzen gibt eine Zeichenkette im ISO-8601-Dauerformat zurück, etwa "P1Y2M10DT2H30M". Das Ergebnis ist identisch mit dem Aufruf von toString() ohne Argumente.
Meist ruft man toJSON() nicht selbst auf. JSON.stringify() ruft sie automatisch auf, sobald ein Temporal.Duration-Objekt serialisiert wird. So lassen sich Dauern ohne zusätzlichen Code in JSON-Nutzlasten, im localStorage oder in API-Anfragen speichern.
Umgekehrt geht das nicht automatisch: JSON.parse() liefert nur eine Zeichenkette zurück. Um wieder ein Temporal.Duration-Objekt zu erhalten, verwendet man Temporal.Duration.from(), am besten in einer reviver-Funktion von JSON.parse().
Rückgabewert
"PT1H30M" oder "-P2D". Eine Nulldauer ergibt "PT0S".Beispiele
Direkter Aufruf und Vergleich mit toString()
const dauer = Temporal.Duration.from({ hours: 1, minutes: 30 });
console.log(dauer.toJSON());
console.log(dauer.toJSON() === dauer.toString());
console.log(Temporal.Duration.from({}).toJSON());
Automatische Serialisierung mit JSON.stringify()
const aufgabe = {
titel: 'Code-Review',
geschaetzt: Temporal.Duration.from({ hours: 2, minutes: 15 }),
puffer: Temporal.Duration.from({ days: 1 })
};
const json = JSON.stringify(aufgabe);
console.log(json);
Rückweg: Dauer per reviver wiederherstellen
const json = '{"titel":"Meeting","laenge":"PT45M"}';
// Felder, die Dauern enthalten, gezielt zurückwandeln
const dauerFelder = new Set(['laenge']);
const termin = JSON.parse(json, (key, value) =>
dauerFelder.has(key) ? Temporal.Duration.from(value) : value
);
console.log(termin.laenge instanceof Temporal.Duration);
console.log(termin.laenge.total('seconds'));
Dauer im localStorage speichern
const timeout = Temporal.Duration.from({ minutes: 5, seconds: 30 });
localStorage.setItem('settings', JSON.stringify({ timeout }));
const geladen = JSON.parse(localStorage.getItem('settings'));
const wieder = Temporal.Duration.from(geladen.timeout);
console.log(wieder.toString());
// Wichtig · Fallstricke
- Keine Optionen: Anders als
toString()nimmttoJSON()keine Parameter wiefractionalSecondDigits,smallestUnitoderroundingModean. Wer eine bestimmte Genauigkeit braucht, ruft vor dem Serialisieren selbsttoString(options)auf. - Keine automatische Deserialisierung:
JSON.parse()liefert eine Zeichenkette. Die Rückwandlung erfolgt mitTemporal.Duration.from(). - Kein Balancing: Die Ausgabe spiegelt die gespeicherten Felder wider.
{ minutes: 90 }ergibt"PT90M", nicht"PT1H30M". Zum Normalisieren vorherround({ largestUnit: 'hour' })verwenden. - Für eine für Menschen lesbare Ausgabe eignet sich
toLocaleString()bzw.Intl.DurationFormat. - Kompatibilität: Temporal ist noch nicht in allen Engines verfügbar (Firefox 139+, Chrome 144+, Safari nicht). Für ältere Umgebungen gibt es das Polyfill
@js-temporal/polyfillbzw.temporal-polyfill.