Signatur
Beschreibung
formatRange() gibt einen Zeitraum aus, etwa „10.–14. März 2024“, und nicht zwei vollständige Datumsangaben hintereinander. Die Methode prüft, welche Teile beider Datumswerte gleich sind (Jahr, Monat, Tag, Tageszeit), und schreibt diese Teile nur einmal. Trennzeichen, Reihenfolge und Abkürzungen hängen vom Gebietsschema ab, das beim Erzeugen der Intl.DateTimeFormat-Instanz angegeben wurde.
Typische Einsatzfälle:
- Veranstaltungszeiträume, z. B. Konferenzen, Urlaube oder Buchungen
- Öffnungszeiten und Termine innerhalb eines Tages, z. B. „09:00–10:30“
- Berichtszeiträume in Dashboards, z. B. „Januar–März 2024“
Die Ausgabe richtet sich nach den Optionen der Instanz, zum Beispiel dateStyle, timeStyle, month, hour oder timeZone. Wenn beide Datumswerte in allen angezeigten Feldern übereinstimmen, liefert die Methode dasselbe Ergebnis wie format(). Ein Bindestrich erscheint dann nicht.
Wenn du die einzelnen Bestandteile getrennt gestalten willst, etwa Start- und Enddatum unterschiedlich hervorheben, nimm stattdessen formatRangeToParts().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $startDate Pflicht | Date | number | Beginn des Zeitraums als Date-Objekt oder als Zeitstempel in Millisekunden. In neueren Umgebungen sind auch Temporal-Objekte erlaubt. |
|
| $endDate Pflicht | Date | number | Ende des Zeitraums, im selben Format wie startDate. |
Rückgabewert
Beispiele
Mehrtägige Veranstaltung ausgeben
const fmt = new Intl.DateTimeFormat('de-DE', {
day: 'numeric',
month: 'long',
year: 'numeric'
});
const start = new Date(2024, 2, 10);
const ende = new Date(2024, 2, 14);
console.log(fmt.formatRange(start, ende));
// Monatsübergreifend
console.log(fmt.formatRange(start, new Date(2024, 3, 14)));
// Jahresübergreifend
console.log(fmt.formatRange(start, new Date(2025, 3, 14)));
Termin innerhalb eines Tages
const terminFmt = new Intl.DateTimeFormat('de-DE', {
dateStyle: 'medium',
timeStyle: 'short'
});
const beginn = new Date(2024, 2, 10, 9, 0);
const schluss = new Date(2024, 2, 10, 10, 30);
console.log(terminFmt.formatRange(beginn, schluss));
Gleiche Datumswerte und Zeitstempel
const fmt = new Intl.DateTimeFormat('de-DE', { dateStyle: 'long' });
const tag = Date.UTC(2024, 0, 15, 12);
// Zeitstempel (number) statt Date-Objekt
// Stimmen alle angezeigten Felder überein, entspricht das Ergebnis format()
console.log(fmt.formatRange(tag, tag + 60 * 60 * 1000));
console.log(fmt.format(tag));
Fehlerbehandlung bei ungültigen Eingaben
const fmt = new Intl.DateTimeFormat('de-DE');
const sicherFormatieren = (von, bis) => {
try {
return fmt.formatRange(von, bis);
} catch (err) {
return `${err.name}: ungültiger Zeitraum`;
}
};
console.log(sicherFormatieren(new Date(2024, 0, 1))); // endDate fehlt
console.log(sicherFormatieren(new Date('kaputt'), new Date())); // Invalid Date
// Wichtig · Fallstricke
- Pflichtargumente: Fehlt eines der beiden Argumente oder ist es
undefined, wirft die Methode einenTypeError. Anders als beiformat()wird dann nicht das aktuelle Datum verwendet. - Ungültige Datumswerte: Ein
Invalid DateoderNaNführt zu einemRangeError. - Endet vor dem Start: Frühe Umsetzungen (ES2021) warfen einen
RangeError, wennendDatevorstartDatelag. Diese Prüfung wurde später aus der Spezifikation entfernt. Ältere Umgebungen verhalten sich daher anders als neue. Prüfe die Reihenfolge am besten selbst. - Ausgabe nicht fest: Die genaue Form hängt von den CLDR-Daten ab, die der Browser oder Node.js mitbringt. Beispiele sind Halbgeviertstrich (–) oder Bindestrich, schmale Leerzeichen und Abkürzungen. Vergleiche die Ergebnisse in Tests deshalb nicht mit festen Strings, und werte sie nicht maschinell aus.
- Zeitzone: Ob zwei Zeitpunkte auf denselben Tag fallen, hängt von der Option
timeZoneab. Ohne diese Option gilt die Zeitzone des Systems. - Kompatibilität: Chrome 76+, Firefox 91+, Safari 14.1+, Node.js 12.9+. Für sehr alte Umgebungen gibt es einen Polyfill unter
@formatjs/intl-datetimeformat.