Signatur
Beschreibung
toLocaleString() formatiert eine reine Uhrzeit (ohne Datum und ohne Zeitzone) so, wie sie Menschen in einer bestimmten Sprache und Region erwarten, etwa 15:30:00 in Deutschland oder 3:30:00 PM in den USA. Intern entspricht der Aufruf new Intl.DateTimeFormat(locales, options).format(time).
Die Methode ist für die Anzeige in der Oberfläche gedacht, zum Beispiel für Öffnungszeiten, Wecker, Fahrpläne oder Terminslots. Für Speicherung, Datenaustausch oder Vergleiche ist sie ungeeignet, denn die Ausgabe hängt von der Laufzeitumgebung ab. Dafür verwendest du toString() oder toJSON(), die das stabile ISO-8601-Format liefern (15:30:00).
Ohne options werden Stunde, Minute und Sekunde ausgegeben. Mit den Optionen von Intl.DateTimeFormat legst du die Ausgabe genauer fest, zum Beispiel mit timeStyle, hour, minute, second, fractionalSecondDigits, hour12/hourCycle oder dayPeriod. Optionen, die ein Datum brauchen (year, month, day, weekday, era, dateStyle) oder eine Zeitzone (timeZoneName), passen nicht zu einer reinen Uhrzeit und lösen einen TypeError aus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $locales | string | string[] | Intl.Locale | undefined | undefined (Standard-Locale der Umgebung) | BCP-47-Sprachkennung wie "de-DE" oder "en-US", oder eine Liste davon in absteigender Priorität. |
| $options | Intl.DateTimeFormatOptions | undefined (entspricht hour, minute, second: "numeric") | Formatierungsoptionen wie bei Intl.DateTimeFormat. Sinnvoll sind timeStyle, hour, minute, second, fractionalSecondDigits, hour12, hourCycle, dayPeriod und numberingSystem. Optionen, die ein Datum oder eine Zeitzone voraussetzen, führen zu einem TypeError. |
Rückgabewert
Beispiele
Standardformat in verschiedenen Sprachen
const zeit = new Temporal.PlainTime(15, 30, 5);
console.log(zeit.toLocaleString("de-DE"));
console.log(zeit.toLocaleString("en-US"));
console.log(zeit.toLocaleString("en-GB"));
// Zum Vergleich: stabiles ISO-Format
console.log(zeit.toString());
Öffnungszeiten kompakt mit timeStyle anzeigen
const oeffnung = Temporal.PlainTime.from("08:00");
const schluss = Temporal.PlainTime.from("18:30");
const kurz = { timeStyle: "short" };
const text = `Geöffnet ${oeffnung.toLocaleString("de-DE", kurz)}–${schluss.toLocaleString("de-DE", kurz)} Uhr`;
console.log(text);
console.log(schluss.toLocaleString("en-US", kurz));
Feine Steuerung: 12-Stunden-Format und Sekundenbruchteile
const t = Temporal.PlainTime.from("21:05:09.456");
// 12-Stunden-Format erzwingen, auch im Deutschen
console.log(t.toLocaleString("de-DE", { hour: "numeric", minute: "2-digit", hour12: true }));
// Stoppuhr-Anzeige mit Millisekunden
console.log(t.toLocaleString("de-DE", {
hour: "2-digit", minute: "2-digit", second: "2-digit",
fractionalSecondDigits: 3
}));
Viele Zeiten performant mit Intl.DateTimeFormat formatieren
// Einen Formatierer wiederverwenden statt bei jedem Aufruf neu zu erzeugen
const fmt = new Intl.DateTimeFormat("de-DE", { timeStyle: "short" });
const slots = ["09:00", "09:30", "10:00"].map((s) => Temporal.PlainTime.from(s));
console.log(slots.map((slot) => fmt.format(slot)).join(", "));
// Datumsoptionen passen nicht zu einer reinen Uhrzeit
try {
slots[0].toLocaleString("de-DE", { dateStyle: "full" });
} catch (e) {
console.log(e.name);
}
// Wichtig · Fallstricke
- Ausgabe nicht maschinell weiterverarbeiten: Das genaue Format hängt vom Browser und von der ICU-/CLDR-Version ab und kann sich ändern. Moderne Engines setzen im Englischen zum Beispiel ein schmales geschütztes Leerzeichen (U+202F) vor „AM/PM“. Stringvergleiche in Tests können deshalb fehlschlagen. Zum Speichern und Parsen verwendest du
toString()bzw.Temporal.PlainTime.from(). - Keine Zeitzone: Ein
PlainTimehat keine Zeitzone. Die Uhrzeit wird deshalb nie umgerechnet. Die OptionentimeZoneNameund alle Datumsoptionen (year,month,day,weekday,dateStyle…) lösen einenTypeErroraus. - Performance: Jeder Aufruf erzeugt intern einen neuen Formatierer. In Schleifen und großen Listen erstellst du besser einmal ein
Intl.DateTimeFormatund rufst dessenformat()auf. Das akzeptiertTemporal.PlainTimedirekt. - Kompatibilität: Temporal ist relativ neu (Firefox 139+, Chrome/Edge 144+). Safari unterstützt es derzeit noch nicht standardmäßig. Für ältere Umgebungen gibt es Polyfills wie
@js-temporal/polyfillodertemporal-polyfill. Die Ausgabe von Polyfills kann in Randfällen von der nativen Umsetzung abweichen.