Signatur
Beschreibung
formatToParts() erzeugt denselben sprachabhängigen Text wie Intl.DurationFormat.prototype.format(). Statt eines fertigen Strings bekommst du aber ein Array von Objekten. Jedes Objekt beschreibt ein Stück der Ausgabe, etwa eine Zahl, einen Einheitennamen oder ein Trennzeichen. Fügt man alle value-Felder aneinander, entsteht genau der String, den format() liefern würde.
Die Methode ist nützlich, wenn einzelne Teile einer Dauer unterschiedlich dargestellt werden sollen. Typische Fälle: Zahlen fett setzen, Einheiten in eigene <span>-Elemente packen, Trennzeichen austauschen oder nur bestimmte Einheiten weiterverarbeiten. Die Lokalisierung (Reihenfolge, Pluralformen, Trennzeichen) übernimmt dabei weiter die Intl-API.
Jedes Teil-Objekt hat die Eigenschaften type und value. Mögliche Werte für type sind "integer", "group", "decimal", "fraction", "minusSign", "unit" und "literal". Teile, die zu einer bestimmten Zeiteinheit gehören, haben zusätzlich die Eigenschaft unit im Singular (z. B. "hour", "minute"). Trennzeichen zwischen zwei Einheiten, etwa ", ", haben keine unit.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $duration Pflicht | Object | Temporal.Duration | Ein Objekt mit mindestens einer der Eigenschaften years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds und nanoseconds. Alle Werte müssen ganze Zahlen sein und dasselbe Vorzeichen haben. Ein Temporal.Duration-Objekt funktioniert ebenfalls. |
Rückgabewert
value-Felder ergeben genau den String von format().Beispiele
Grundlegende Zerlegung einer Dauer
const df = new Intl.DurationFormat("en", { style: "long" });
const parts = df.formatToParts({ hours: 7, minutes: 8, seconds: 30 });
console.log(parts);
Zahlen in HTML hervorheben (mit Escaping)
const escapeHtml = (s) =>
s.replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c]);
const df = new Intl.DurationFormat("en", { style: "long" });
const html = df
.formatToParts({ hours: 2, minutes: 15 })
.map(({ type, value }) =>
type === "integer" ? `<strong>${escapeHtml(value)}</strong>` : escapeHtml(value)
)
.join("");
console.log(html);
Digitale Anzeige: Teile nach Einheit auswerten
const df = new Intl.DurationFormat("en", { style: "digital" });
const parts = df.formatToParts({ hours: 1, minutes: 5, seconds: 3 });
// Nur die Zahlen je Einheit sammeln
const values = Object.fromEntries(
parts
.filter((p) => p.type === "integer")
.map((p) => [p.unit, p.value])
);
console.log(parts.map((p) => p.value).join(""));
console.log(values);