Zum Inhalt springen

Date-Format-Tokens

Es gibt zwei weit verbreitete Familien von Date-Format-Strings, und sie überlappen sich gerade genug, um gefährlich zu sein. strftime – aus C und geerbt von Python, Ruby, PHP und GNU date – verwendet Prozent-Tokens wie %Y. Unicode LDML, verwendet von ICU, Java, moment und dayjs, verwendet wiederholte Buchstaben wie yyyy. In LDML ist MM ein Monat und mm eine Minute; dieses Paar rückwärts zu bekommen ist der klassische Fehler.

Jede Zeile unten ist für denselben Augenblick gerenderst: Montag, 9. März 2026, 14:05:07 UTC. Dieses Datum wird so gewählt, dass nichts verborgen ist – ein einstelliger Tag und Monat exponieren Zero-Padding, die Nachmittagsstunde macht die 12- und 24-Stunden-Uhren sichtbar unterschiedlich, und der Wochentag ist eindeutig.

Eine leere äquivalente Spalte bedeutet, dass der andere Dialekt kein einzelnes Token dafür hat und du den Wert selbst zusammensetzen musst. Die Test-Suite renderst die Kalenderfelder mit den eigenen Datumsfunktionen der Plattform und vergleicht sie mit dieser Tabelle, also können die Beispiele nicht von der Realität abweichen.

Jahr

4
strftimeLDMLFeldRenderst als
%YyyyyVierstelliges Jahr2026
%yyyZweistelliges JahrMehrdeutig durch Konstruktion. Vermeide es in etwas Gespeichertem.26
%CJahrhundert – das Jahr dividiert durch 10020
%GYYYYUnterscheidet sich vom Kalenderjahr um Jahreswechsel. Mit der ISO-Wochennummer verwenden.Unterscheidet sich vom Kalenderjahr um Jahreswechsel. Mit der ISO-Wochennummer verwenden.2026

Monat

4

In LDML ist MM der Monat und mm die Minute.

strftimeLDMLFeldRenderst als
%mMMMonat, Zero-Padded03
%-mMMonat, kein Padding3
%bMMMAbgekürzter Monat-NameMar
%BMMMMVollständiger Monat-NameMarch

Tag und Wochentag

8

In LDML ist dd der Tagesmonat und DDD der Jahrestag.

strftimeLDMLFeldRenderst als
%dddTagesmonat, Zero-Padded09
%-ddTagesmonat, kein Padding9
%eTagesmonat, Space-Padded 9
%jDDDJahrestag, 001–366068
%aEEEAbgekürzter Wochentag-NameMon
%AEEEEVollständiger Wochentag-NameMonday
%uWochentag als Zahl, Montag ist 1%w nummeriert die gleichen Tage von Sonntag als 0.1
%VwwISO-Wochennummer, Wochen beginnend Montag11

Zeit

8
strftimeLDMLFeldRenderst als
%HHHStunde auf der 24-Stunden-Uhr14
%-HHStunde, kein Padding14
%IhhStunde auf der 12-Stunden-Uhr02
%MmmMinute05
%SssSekunde07
%3NSSSMillisekunden000
%paAM oder PMPM
%sUnix-Zeitstempel – Sekunden seit 1970-01-01 UTC1773065107

Ein Offset ist eine Zahl; ein Zone-Name ist eine Regel. Nur der Name überlebt eine DST-Änderung.

3

Ein Offset ist eine Zahl; ein Zone-Name ist eine Regel. Nur der Name überlebt eine DST-Änderung.

strftimeLDMLFeldRenderst als
%zZZUTC-Offset, kein Doppelpunkt+0000
%:zXXXUTC-Offset mit Doppelpunkt, wie ISO 8601 es will+00:00
%ZzzzZeit-Zone-AbkürzungAbkürzungen sind nicht eindeutig – CST ist mindestens drei verschiedene Zonen.UTC

Häufige Kombinationen

7

Aus den Tokens oben gebaut – keine Bibliothek notwendig.

strftimeLDMLFeldRenderst als
%Fyyyy-MM-ddISO-Datum2026-03-09
%THH:mm:ss24-Stunden-Zeit14:05:07
%FT%T%:zyyyy-MM-dd'T'HH:mm:ssXXXVollständiger ISO 8601-ZeitstempelDas Format zum Speichern. Sortiert als Text, eindeutig über den Offset.2026-03-09T14:05:07+00:00
%a, %d %b %Y %T %zEEE, dd MMM yyyy HH:mm:ss ZZRFC 2822 – Email-Header und älteres HTTPMon, 09 Mar 2026 14:05:07 +0000
%m/%d/%YMM/dd/yyyyUS-Konvention, Monat zuerst03/09/2026
%d.%m.%Ydd.MM.yyyyEuropäische Konvention, Tag zuerst09.03.2026
%%''Ein wörtliches Prozentzeichen%

Häufige Fragen

Was ist der Unterschied zwischen yyyy und YYYY?
In LDML ist yyyy das Kalenderjahr und YYYY das ISO-Nummernierungsjahr. Sie unterscheiden sich für ein paar Tage im Januar: 2027-01-01 fällt in ISO-Woche 53 von 2026, also liest YYYY dort 2026. Die Verwendung von YYYY versehentlich produziert einen Fehler, der einmal im Jahr auftaucht und dann verschwindet, weshalb es so schwer zu fangen ist.
Warum wird mein Monat als Minuten angezeigt?
Weil du in einem LDML-Dialekt bist und mm statt MM verwendest. LDML ist case-sensitive: M ist Monat, m ist Minute, D ist Jahrestag, d ist Tagesmonat. strftime hat die gleiche Falle an einem anderen Ort – %M sind Minuten und %m ist der Monat.
Wie erhalte ich eine gepaddete versus ungepaddete Zahl?
In strftime entfernt die GNU-Erweiterung %-d das Padding, also %d ist 09 und %-d ist 9. In LDML setzt die Buchstabenzahl die Breite direkt: d ist 9 und dd ist 09. Keine ist portierbar – %-d existiert nicht auf jeder Plattform.
In welchem Format sollte ich Daten speichern?
ISO 8601 mit einem expliziten Offset – 2026-03-09T14:05:07+00:00. Es sortiert sich korrekt als Text, es ist eindeutig über den Offset, und jede Sprache parst es. Speichere das und formatiere für die Anzeige im letzten möglichen Moment; ein gespeichertes lokales Datum ohne Offset ist unwiderbringlicher Informationsverlust.