Ein rohes JavaScript Date-Objekt oder ein ISO-String aus deiner Datenbank sieht für Benutzer nicht besonders schön aus (z.B. 2026-05-05T08:00:00.000Z). Mit der DatePipe kannst du diese technischen Formate mühelos in gut lesbare, lokalisierte Datums- und Zeitangaben umwandeln. In diesem Artikel lernst du alle Tricks, von vordefinierten Formaten bis hin zur Behandlung von Zeitzonen.
Grundlagen & Syntax
Die DatePipe verarbeitet verschiedene Eingabeformate: klassische JavaScript Date-Objekte, Zeitstempel (Millisekunden als Number) oder ISO-Strings.
Die vollständige Syntax im Template lautet:
{{ wert | date : format : zeitzone : locale }}
import { Component } from '@angular/core';
import { DatePipe } from '@angular/common'; // Import notwendig bei Standalone!
@Component({
selector: 'app-event',
template: `
<!-- Ohne Pipe: Mon May 05 2026 12:30:00 GMT+0200 ... -->
<p>Roh: {{ eventDate }}</p>
<!-- Mit DatePipe (Standardformat 'mediumDate'): May 5, 2026 -->
<p>Standard: {{ eventDate | date }}</p>
<!-- Vordefiniertes Format 'shortTime': 12:30 PM -->
<p>Kurze Zeit: {{ eventDate | date:'shortTime' }}</p>
<!-- Individuelles Format: 05.05.2026 -->
<p>Individuell: {{ eventDate | date:'dd.MM.yyyy' }}</p>
`,
standalone: true,
imports: [DatePipe]
})
export class EventComponent {
// Ein JS Date-Objekt (könnte auch ein String '2026-05-05T12:30:00' sein)
eventDate = new Date(2026, 4, 5, 12, 30);
}Vordefinierte vs. Individuelle Formate
Angular bringt eine Reihe von praktischen Kurznamen (Pre-defined Formats) mit. Diese sind besonders nützlich, weil sie sich automatisch an die Sprachebene (Locale) des Benutzers anpassen.
Häufige vordefinierte Formate (am Beispiel US-Locale vs DE-Locale)
| Format | Ausgabe US (en-US) | Ausgabe DE (de-DE) |
|---|---|---|
'short' | 5/5/26, 12:30 PM | 05.05.26, 12:30 |
'medium' | May 5, 2026, 12:30:00 PM | 05.05.2026, 12:30:00 |
'long' | May 5, 2026 at 12:30:00 PM GMT+2 | 5. Mai 2026 um 12:30:00 MESZ |
'shortDate' | 5/5/26 | 05.05.26 |
'mediumDate' | May 5, 2026 (Standard) | 05.05.2026 |
'shortTime' | 12:30 PM | 12:30 |
Eigene Format-Strings
Wenn du strikte Vorgaben vom Design-Team hast, kannst du das Format exakt zusammenbauen, indem du die einzelnen Format-Zeichen kombinierst:
y,yy,yyyy= Jahr (26, 2026)M,MM,MMM,MMMM= Monat (5, 05, May/Mai, May/Mai)d,dd= Tag des Monats (5, 05)E,EE,EEEE= Wochentag (Tue, Tue, Tuesday)H,HH= Stunde (24h Format, 0-23)h,hh= Stunde (12h Format, 1-12)m,mm= Minutes,ss= Sekunde
Beispiel: {{ eventDate | date:'EEEE, dd. MMMM yyyy HH:mm' }}
Ergibt (bei deutschem Locale): Dienstag, 05. Mai 2026 12:30
Deutsche Formatierung (Locale)
Ähnlich wie bei der CurrencyPipe verwendet die DatePipe standardmäßig das amerikanische System (en-US). Um z.B. bei 'shortDate' die deutsche Schreibweise (05.05.26) zu erhalten, musst du die Locale-Daten laden und bereitstellen.
In deiner app.config.ts:
import { ApplicationConfig, LOCALE_ID } from '@angular/core';
import { registerLocaleData } from '@angular/common';
import localeDe from '@angular/common/locales/de';
// Lade die deutschen Sprachdaten in Angular
registerLocaleData(localeDe);
export const appConfig: ApplicationConfig = {
providers: [
// Setze Deutsch als Standardsprache für alle Pipes
{ provide: LOCALE_ID, useValue: 'de-DE' }
]
};Jetzt übersetzt die DatePipe automatisch Wochentage, Monate und nutzt die richtige Anordnung für Punkte und Doppelpunkte, wenn du vordefinierte Formate wie 'full' oder 'longDate' nutzt.
Globale Konfiguration & Zeitzonen (Timezones)
Manchmal erhältst du Daten von deinem Backend (z.B. in UTC Z), möchtest sie aber in der Zeitzone des Nutzers oder einer bestimmten festen Zeitzone anzeigen.
Du kannst die Zeitzone direkt im Template übergeben:
{{ datum | date:'shortTime':'+0430' }} oder {{ datum | date:'shortTime':'EST' }}
Globale Voreinstellungen (DATE_PIPE_DEFAULT_OPTIONS)
Seit neueren Angular Versionen musst du das Format oder die Zeitzone nicht mehr in jedem Template einzeln mitschleppen. Du kannst eine globale Standardkonfiguration in deinen Providern hinterlegen:
import { ApplicationConfig } from '@angular/core';
import { DATE_PIPE_DEFAULT_OPTIONS } from '@angular/common';
export const appConfig: ApplicationConfig = {
providers: [
{
provide: DATE_PIPE_DEFAULT_OPTIONS,
useValue: {
dateFormat: 'dd.MM.yyyy', // Jeder '| date' Aufruf ohne Format nutzt nun dieses!
timezone: '+0200' // Fixiert die Zeitzone
}
}
]
};Häufige Stolperfallen bei der DatePipe
Locale vergessen zu registrieren
Out of the box bringt Angular nur en-US mit. Setzt du LOCALE_ID auf ‘de-DE’, ohne vorher registerLocaleData(localeDe) in der app.config.ts aufzurufen, wirft Angular einen Runtime-Error („Missing locale data”). Beide Schritte gehören immer zusammen.
Mutiertes Date-Objekt rendert nicht neu
Die Pipe re-evaluiert nicht, wenn du das bestehende Date in-place änderst (z. B. this.date.setHours(10)). Sie reagiert nur auf eine neue Referenz: this.date = new Date(this.date.setHours(10)). Sonst bleibt die Anzeige hängen, obwohl der Wert intern korrekt ist.
Hart kodierte Formate ignorieren das Locale
‘dd/MM/yyyy’ bleibt mit Schrägstrich, egal ob der Nutzer in den USA oder Deutschland sitzt. Nur die vordefinierten Formate (‘short’, ‘mediumDate’, ‘longDate’, ‘fullDate’) passen sich automatisch an Trennzeichen, Reihenfolge und Sprache an. Für I18n-fähige Apps sind sie fast immer die richtige Wahl.
Timezone-Strings sind nicht beliebig
Akzeptiert sind Offsets wie ‘+0200’ oder ‘-0430’, IANA-Kürzel wie ‘UTC’ sowie ‘GMT-08:00’. Beliebte Wunschwerte wie ‘Europe/Berlin’ funktionieren nicht — die DatePipe nutzt nicht die Intl.DateTimeFormat-Engine direkt. Für vollwertige IANA-Zonen brauchst du eine eigene Pipe oder z. B. Luxon.
ISO-String ohne Zeitzone wird als lokal interpretiert
Übergibst du ‘2026-05-05’ (kein Z, kein Offset), interpretiert die Pipe das als lokale Zeit, nicht als UTC. Beim Rendern in einer anderen Zeitzone kann das Datum dadurch um einen Tag verschoben aussehen. Mit ‘2026-05-05T00:00:00Z’ bist du eindeutig.
DATE_PIPE_DEFAULT_OPTIONS seit v15
Statt in jedem Template Format und Zeitzone zu wiederholen, hinterlegst du beides global per DATE_PIPE_DEFAULT_OPTIONS-Provider. Explizite Pipe-Argumente überschreiben die Defaults zur Laufzeit — du hast also weiterhin volle Kontrolle, wenn ein einzelnes Template abweichen muss.
Weiterführende Ressourcen
Externe Quellen
- DatePipe API (mit vollständiger Format-Tabelle) – Angular.dev
- Setting your app locale (I18n) – Angular.dev