Stellen Sie Ihre Frage und erhalten Sie einen Resümee des Dokuments, indem Sie diese Seite und den AI-Anbieter Ihrer Wahl referenzieren
Der Inhalt dieser Seite wurde mit einer KI übersetzt.
Den englischen Originaltext ansehenWenn Sie eine Idee haben, um diese Dokumentation zu verbessern, zögern Sie bitte nicht, durch das Einreichen eines Pull-Requests auf GitHub beizutragen.
GitHub-Link zur DokumentationMarkdown des Dokuments in die Zwischenablage kopieren
Datums- und Zahlenformatierung nach Locale mit Intl
Das Übersetzen von Texten ist nur die sichtbare Hälfte der Internationalisierung. Die andere Hälfte, die regelmäßig Fehlerberichte erzeugt, ist die Formatierung: ein deutscher Nutzer, der 1,234.56 statt 1.234,56 sieht, ein japanischer Nutzer, der 08/02/2026 als August liest, oder ein Datum, das auf Server und Client unterschiedlich rendert und beim Hydrieren die Anwendung zum Absturz bringt.
Für nichts davon ist eine externe Bibliothek erforderlich. Intl ist in jeder modernen JavaScript-Laufzeitumgebung integriert.
Inhaltsverzeichnis
Beginnen Sie damit, eigene Datums-Hilfsfunktionen zu löschen
Fast jede Codebasis enthält irgendwo ein selbst geschriebenes formatDate, das entstand, bevor jemand an Locales dachte. Es legt eine starre Reihenfolge, Trennzeichen und meist englische Monatsnamen fest.
Kopieren Sie den Code in die Zwischenablage
Intl.DateTimeFormat ersetzt dies vollständig und ist für jede Locale korrekt:
Kopieren Sie den Code in die Zwischenablage
Dasselbe gilt für Zahlenwerte. toFixed(2) erzeugt überall 1234.56, was im Großteil Europas schlichtweg falsch ist.
Was Intl abdeckt
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| API | Verwendungszweck |
|---|---|
Intl.DateTimeFormat | Datums- und Zeitangaben mit dateStyle / timeStyle |
Intl.NumberFormat | Dezimalzahlen, Währungen, Prozent, Einheiten, Kompaktform |
Intl.RelativeTimeFormat | "vor 3 Tagen", "in 2 Stunden" |
Intl.ListFormat | "a, b und c" im Vergleich zu "a, b, and c" |
Intl.PluralRules | Pluralisierungskategorien für Zahlenwerte |
Intl.Collator | Sprachlich korrekte Sortierung von Zeichenketten |
Intl.Collator wird gern übersehen. Ein einfaches array.sort() auf Strings nutzt die Unicode-Codepoint-Reihenfolge, wodurch Umlaute hinter das z rutschen und das schwedische ö an falscher Stelle landet. Wer für Nutzer sichtbare Listen sortiert, sollte stets einen Collator einsetzen.
Kopieren Sie den Code in die Zwischenablage
Voreinstellungen bevorzugen statt manueller Optionen
dateStyle und timeStyle überlassen der jeweiligen Locale die logische Reihenfolge und Trennzeichen. Wer year, month und day manuell kombiniert, greift in Bereiche ein, die man besser meidet, da die korrekte Anordnung je nach Land variiert und man CLDR-Daten mit eigenen Annahmen überschreibt.
Kopieren Sie den Code in die Zwischenablage
Spezifizieren Sie Einzelteile nur dann explizit, wenn das Design zwingend eine feste Breite vorschreibt, beispielsweise in einer engen Tabellenspalte.
Das Erstellen von Formatierern ist rechenintensiv
Dies ist das Performance-Detail, auf das es ankommt. Die Initialisierung eines Intl.NumberFormat lädt umfangreiche Locale-Daten und ist deutlich teurer als der eigentliche Aufruf von .format(). Dies in einer Schleife über tausend Tabellenzeilen auszuführen, bremst spürbar.
Kopieren Sie den Code in die Zwischenablage
toLocaleDateString() und toLocaleString() verbergen intern denselben Mechanismus: Jeder Aufruf instanziiert einen neuen Formatierer. Für Einzelwerte völlig in Ordnung, für Listen fehl am Platz.
Cachen Sie Formatierer basierend auf Locale und Optionen:
Kopieren Sie den Code in die Zwischenablage
Der Zeitzonen-Fehler, der nur in Produktion auftritt
Dieses Problem hat schon unzählige Stunden gekostet. Der Server rendert ein Datum bei der serverseitigen Generierung, der Browser hydriert es im Client, und React bricht mit einem Hydration Mismatch ab, weil beide Umgebungen unterschiedlichen Text erzeugt haben.
Die Ursache: Intl.DateTimeFormat verwendet die lokale Zeitzone des Systems, wenn keine angegeben wird. Ihr Produktionsserver läuft unter UTC, Ihr lokaler Entwicklungsrechner nicht. Der Fehler ist lokal unsichtbar und tritt erst in Produktion auf.
Kopieren Sie den Code in die Zwischenablage
Drei gangbare Lösungswege:
- Zeitzone auf dem Server fixieren und explizit übergeben. Deterministisch, aber alle Nutzer sehen UTC.
- Nur auf dem Client rendern, mit einem Platzhalter während des Server-Passes. Individuell korrekt, erzeugt jedoch ein leichtes Nachladen.
- Zeitzone des Nutzers speichern und an beiden Stellen übergeben. Das beste Ergebnis bei moderatem Mehraufwand.
Unabhängig von der Wahl: Übergeben Sie timeZone bei isomorphen Datumsangaben immer explizit. Ein Datum ohne definierte Zeitzone führt unweigerlich zu zwei abweichenden Werten.
Währungen benötigen eine Währung, keine Locale
Locale und Währung sind unabhängig voneinander. fr-FR bedeutet nicht automatisch Euro: Ein französischer Kunde kann durchaus eine Rechnung in US-Dollar betrachten.
Kopieren Sie den Code in die Zwischenablage
Die Locale steuert Trennzeichen, Zifferngruppierung und die Platzierung des Währungssymbols. Die Währung selbst stammt aus Ihren Geschäftsdaten. Die Ableitung des einen aus dem anderen führt unweigerlich zu Fehlern in der Buchhaltung.
Beachten Sie auch currencyDisplay. In Systemen mit mehreren Währungen, die das Dollarzeichen teilen, beseitigt "code" jegliche Mehrdeutigkeit zwischen US-, kanadischen und australischen Dollar.
Relative Zeitangaben sind oft lesbarer als absolute Daten
Für kürzlich zurückliegende Ereignisse ist "vor 2 Stunden" weit eingängiger als ein Zeitstempel, und Intl.RelativeTimeFormat lokalisiert dies automatisch.
Kopieren Sie den Code in die Zwischenablage
numeric: "auto" liefert "gestern" statt "vor 1 Tag". Ohne diese Option erhält man die unnatürlich wirkende rein numerische Schreibweise.
Was Intlayer ergänzt
Intlayer bündelt diese APIs in gecachten Hilfsfunktionen, sodass Sie keine eigene Cache-Map verwalten müssen, und wendet die aktive Locale standardmäßig an, ohne dass sie an jeder Aufrufstelle übergeben werden muss.
Kopieren Sie den Code in die Zwischenablage
Die Funktion date() unterstützt zudem Presets ("short", "long", "dateOnly", "timeOnly", "full"), womit typische Anwendungsfälle ohne Options-Objekt auskommen. Für React und Vue stehen Hooks und Composables bereit, die die aktive Sprache direkt aus dem Kontext ermitteln.
Dabei handelt es sich um eine komfortable Caching- und Locale-Schicht über der nativen Plattform-API. Das eigentliche Formatierungsverhalten basiert vollständig auf Intl. Sämtliche Signaturen finden sich in der Formatierungsdokumentation.
Häufige Fehler
toLocaleDateString()ohne Locale-Angabe. Verwendet die Standard-Locale des Systems, die auf einem Server vom Container abhängt.- Formatieren in einer Schleife ohne Caching. Die Instanziierung des Formatierers dominiert die Laufzeit.
- Fehlende
timeZone-Angabe bei isomorphen Datumsangaben. Führt zu Hydration-Fehlern, die lokal nicht auftreten. - Währung aus der Locale ableiten.
fr-FRgarantiert keine Euro-Werte. - Einfaches
sort()auf sichtbaren Texten. Nutzen Sie stetsIntl.Collator. - Monats- oder Wochentagsnamen fest codieren. Sie sind bereits in jeder Sprache im CLDR hinterlegt.
numeric: "always"bei relativen Zeiten beibehalten. Erzeugt "vor 1 Tag", obwohl jede Sprache ein Wort wie gestern kennt.
Weiterführende Ressourcen
- Formatierer und Locale-Hilfsfunktionen:
number,currency,date,relativeTime,list - Konfigurationsreferenz
- Framework-Benchmarkberichte
- react-intl-Kompatibilitätsadapter
- ICU Message Format: Plurale, Select und Zahlenskelette
- Übersetzungen testen: Inklusive Formatierer und Pluralregeln
- Was Internationalisierung wirklich umfasst
Kommentare
Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.
