Start · Sprachen · JavaScript · Referenz · Intl.DateTimeFormat.prototype.format()

Intl.DateTimeFormat.prototype.format()

Methode

Formatiert ein Datum (<code>Date</code> oder Zeitstempel) als lesbaren String, und zwar nach Gebietsschema und Optionen der <code>Intl.DateTimeFormat</code>-Instanz.

seit JavaScript ECMA-402 1. Ausgabe (2012) – Baseline: alle Browse Kategorie: method-property

Signatur

Intl.DateTimeFormat.prototype.format(date)

Beschreibung

Mit format() wandelt man Datums- und Zeitwerte in Text um, der für Menschen gedacht ist. Welche Sprache, Reihenfolge, Zeitzone und Genauigkeit die Ausgabe hat, legt man vorher im Konstruktor new Intl.DateTimeFormat(locales, options) fest. Die Methode selbst bekommt nur noch das Datum.

Technisch ist format eine Getter-Eigenschaft. Sie liefert eine Funktion, die schon an ihre Instanz gebunden ist. Deshalb kann man fmt.format direkt als Rückruffunktion übergeben, z. B. an Array.prototype.map(), ohne vorher bind() aufzurufen.

Wer viele Datumswerte gleich formatiert (Tabellen, Listen, Protokolle), sollte die Instanz einmal anlegen und dann wiederverwenden. Das ist deutlich schneller als jedes Mal Date.prototype.toLocaleDateString() aufzurufen, weil dort intern bei jedem Aufruf ein neues Formatierungsobjekt entsteht.

Wenn man die einzelnen Bestandteile des Ergebnisses braucht, etwa um den Monat extra auszuzeichnen, nimmt man formatToParts(). Für Zeiträume gibt es formatRange().

Parameter

Name Typ Default Beschreibung
$date Date | number | undefined Date.now() Das Datum, das formatiert werden soll. Erlaubt sind ein Date-Objekt oder ein Zeitstempel in Millisekunden seit der Unix-Epoche. Fehlt der Wert oder ist er undefined, wird der aktuelle Zeitpunkt verwendet. In neueren Engines mit Temporal-Unterstützung sind auch passende Temporal-Objekte erlaubt.

Rückgabewert

Typ
string
Beschreibung
Das formatierte Datum als String, abhängig von Gebietsschema, Kalender, Zahlensystem, Zeitzone und den gewählten Optionen.

Beispiele

Einfache Formatierung für Deutschland

const fmt = new Intl.DateTimeFormat('de-DE');

console.log(fmt.format(new Date(2024, 2, 15)));
15.3.2024

Datum und Uhrzeit mit Stil und fester Zeitzone

const fmt = new Intl.DateTimeFormat('de-DE', {
  dateStyle: 'full',
  timeStyle: 'short',
  timeZone: 'Europe/Berlin'
});

// 13:30 UTC entspricht 14:30 MEZ
const termin = new Date(Date.UTC(2024, 2, 15, 13, 30));
console.log(fmt.format(termin));
Freitag, 15. März 2024 um 14:30

Gebundene Funktion direkt an map() übergeben

const fmt = new Intl.DateTimeFormat('de-DE', {
  day: '2-digit',
  month: '2-digit',
  year: 'numeric',
  timeZone: 'UTC'
});

const zeitstempel = [Date.UTC(2024, 0, 1), Date.UTC(2024, 11, 24)];

// format ist schon gebunden, bind() ist nicht nötig
console.log(zeitstempel.map(fmt.format));
["01.01.2024", "24.12.2024"]

Ungültige Datumswerte abfangen

const fmt = new Intl.DateTimeFormat('de-DE', { month: 'long', year: 'numeric' });

const sicherFormatieren = (wert) => {
  const d = new Date(wert);
  return Number.isNaN(d.getTime()) ? '–' : fmt.format(d);
};

console.log(sicherFormatieren('2024-03-15'));
console.log(sicherFormatieren('kaputt'));

try {
  fmt.format(new Date('kaputt'));
} catch (e) {
  console.log(e.name);
}
März 2024 – RangeError

// Wichtig · Fallstricke

  • Ungültige Datumswerte: Ist das Datum ungültig, z. B. new Date('abc') oder NaN, wirft die Methode einen RangeError. Sie gibt dann nicht „Invalid Date" zurück.
  • Ausgabe nicht fest einplanen: Der genaue Text hängt von der ICU- bzw. CLDR-Version der Engine ab. Chrome 110+ und Node.js 20+ setzen z. B. im englischen Zeitformat vor „AM/PM" ein schmales geschütztes Leerzeichen (U+202F). Wer formatierte Strings auswertet oder in Tests Zeichen für Zeichen vergleicht, bekommt dadurch Fehler. Zum Speichern und Auswerten nimmt man toISOString() oder formatToParts().
  • Zeitzone: Ohne die Option timeZone gilt die Zeitzone des Systems. Auf Servern (Node.js, oft UTC) kann dann ein anderes Datum herauskommen als im Browser des Nutzers. Deshalb die Zeitzone ausdrücklich angeben.
  • Leistung: Die Instanz einmal anlegen und wiederverwenden. Die Formatierung selbst ist schnell, das Erzeugen eines neuen Formatierungsobjekts ist dagegen teuer.
  • dateStyle/timeStyle lassen sich nicht mit einzelnen Komponenten-Optionen wie month oder hour kombinieren. Das führt zu einem TypeError, und zwar schon im Konstruktor.
  • Browser-Unterstützung: in allen modernen Browsern vorhanden. dateStyle/timeStyle gibt es erst seit 2020 (Chrome 76, Firefox 79, Safari 14.1).