Interaktive Referenz: Format-Strings testen, Parameter nachschlagen und strtotime()-Ausdrücke ausprobieren.
{{ dateResult }}
<?php echo date("{{ dateFormat }}"); ?>
| {{ __t('th_character') }} | {{ __t('th_description') }} | {{ __t('th_example') }} | |
|---|---|---|---|
| {{ group.title }} | |||
{{ p.char }} |
{{ p.desc }} | {{ getParamExample(p.char) }} | |
{{ strtotimeResult.timestamp }}
{{ strtotimeResult.formatted }}
{{ strtotimeResult.relative }}
{{ strtotimePhpCode }}
| {{ __t('th_expression') }} | {{ __t('th_description') }} | {{ __t('label_result') }} |
|---|---|---|
{{ ref.expr }} |
{{ ref.desc }} | {{ getStrtotimeExample(ref.expr) }} |
Die Funktion date(string $format, ?int $timestamp = null) formatiert einen Unix-Timestamp oder die aktuelle Zeit in einen lesbaren String. Der Format-String besteht aus Platzhaltern wie Y (vierstelliges Jahr), m (Monat mit führender Null), d (Tag) oder H:i:s (Stunden:Minuten:Sekunden im 24h-Format).
strtotime(string $datetime, ?int $baseTimestamp = null) wandelt englische Textbeschreibungen in Unix-Timestamps um. Typische Eingaben: "now", "+1 day", "next monday", "first day of next month", "last day of december 2025". Die Funktion ist extrem flexibel und versteht auch kombinierte Ausdrücke wie "+2 weeks 3 days".
date() intern arbeitetdate(string $format, ?int $timestamp = null): string ist seit PHP 4 ein Wrapper um die libc-Zeitfunktionen, intern aber komplett selbst implementiert, damit alle Format-Buchstaben portabel gleich funktionieren. Wird kein Timestamp uebergeben, ruft PHP time() auf, was den aktuellen Unix-Timestamp (Sekunden seit 1970-01-01T00:00:00Z) zurueckgibt. Die Ausgabe erfolgt immer in der Default-Zeitzone des Skripts, die per date_default_timezone_set() oder ueber die date.timezone-INI-Direktive gesetzt wird. Wer keinen Wert setzt, faellt seit PHP 5.4 auf UTC zurueck, was haeufig zu Bugs in lokal entwickelten Anwendungen fuehrt.
Die Format-Buchstaben kommen aus der ISO-Norm fuer Datums-Ausgabeformate und sind absichtlich case-sensitive: m ist die Monatszahl mit fuehrender Null (01-12), M der dreibuchstabige Monatsname auf Englisch (Jan), n die Monatszahl ohne fuehrende Null. Wer ein Zeichen literal ausgeben will, muss es per Backslash escapen — date('\W\o\c\h\e W') ergibt Woche 23. Vorsicht beim Verwechseln: Y ist die vierstellige Jahreszahl, y die zweistellige, o ist die ISO-8601-Woche-Jahreszahl, die sich am Jahresende um eins von Y unterscheiden kann. Genau das verursacht die berühmten "31. Dezember zeigt das falsche Jahr"-Bugs.
Seit PHP 5.5 ist die moderne Empfehlung, DateTimeImmutable mit format() zu nutzen — sie akzeptiert exakt die gleichen Format-Buchstaben, ist aber thread-sicher, kennt eigene Zeitzonen und unterstuetzt Mikrosekunden (u) und Millisekunden (v). strtotime() ist hingegen ein eigenstaendiger Parser, der natuerlichsprachliche Zeitangaben in einen Unix-Timestamp uebersetzt. Er folgt der GNU-Date-"Date Input Formats"-Syntax mit Erweiterungen — und ist beruechtigt fuer Mehrdeutigkeiten: strtotime('15/10/2024') wird als 15. Oktober interpretiert (mit Slash = US-Format mit Tag und Monat vertauscht?), strtotime('2024-15-10') hingegen liefert false. Fuer eindeutige Eingaben besser DateTimeImmutable::createFromFormat().
Diese Buchstaben deckt du in 95 % aller realen Anwendungen ab. Eine komplette Liste steht in der PHP-Doku (php.net/manual/de/datetime.format.php).
d (01-31, mit Null), j (1-31, ohne Null), D (Mon-Sun), l (Monday-Sunday), N (1-7 ISO-Wochentag).m (01-12), n (1-12), M (Jan-Dec), F (January-December), t (Tage im Monat, 28-31).Y (2024), y (24), o (ISO-8601-Wochen-Jahr — Achtung an Jahresgrenzen), L (1 wenn Schaltjahr).H (00-23), G (0-23), h (01-12), g (1-12), i (00-59 Minute), s (00-59 Sekunde), a (am/pm), A (AM/PM), v (Millisekunden).e (Europe/Berlin), O (+0200), P (+02:00), T (CEST), c (ISO 8601), r (RFC 2822), U (Unix-Sekunden).date("Y-m-d") — ISO-Datum: 2025-03-15date("d.m.Y") — Deutsches Format: 15.03.2025date("Y-m-d H:i:s") — MySQL Datetimedate("c") — ISO 8601: 2025-03-15T14:30:00+01:00date("r") — RFC 2822: Sat, 15 Mar 2025 14:30:00 +0100date("U") — Unix-TimestampDiese Strings tauchen so in vielen Frameworks und Standards auf — kopiere und passe sie an deine Use Cases an.
date("Y-m-d H:i:s") → 2024-06-09 14:32:01. MySQL-DATETIME-Standard, passt in DATETIME/TIMESTAMP-Spalten ohne weitere Umwandlung.date("c") → 2024-06-09T14:32:01+02:00. Voller ISO 8601-String mit Zeitzonen-Offset — der Standard fuer REST-APIs und JSON-Payloads.date("r") → Sun, 09 Jun 2024 14:32:01 +0200. RFC 2822-Format, das HTTP Date:-Header und Email-Header benoetigen.date("d.m.Y") → 09.06.2024. Deutsches Standardformat, identisch im Output zu strftime("%d.%m.%Y") (das deprecatete Pendant).date("W/o") → 23/2024. ISO-Kalenderwoche mit korrekter Wochen-Jahreszahl — bei date("W/Y") waere das am 1. Januar 2024 falsch (01/2024 statt 52/2023).Die haeufigste Stolperfalle ist die Zeitzone. PHP nimmt die date.timezone-INI-Direktive — wenn die nicht gesetzt ist, faellt PHP auf UTC zurueck und du bekommst Zeiten um Stunden verschoben. Auf Shared-Hosting-Umgebungen ist date_default_timezone_set('Europe/Berlin') am Skript-Anfang Pflicht. Zweitens: strtotime() hat unvorhersehbares Verhalten bei mehrdeutigen Eingaben — strtotime('2024-02-30') liefert keinen false, sondern den 1. Maerz. Drittens: das Y2038-Problem. time() ist auf 32-Bit-PHP ein signed int32 und laeuft am 19. Januar 2038 um 03:14:08 UTC ueber — alle 64-Bit-PHP-Builds sind safe, aber Datenbanken mit INT-Spalten fuer Timestamps muessen migriert werden. Viertens: date() kennt keine Lokalisierung, D und F liefern immer Englisch. Fuer mehrsprachige Ausgaben braucht es IntlDateFormatter aus der intl-Extension. Fuenftens: DST-Wechsel — strtotime('+1 day') in einer Nacht der Sommerzeitumstellung kann 23 oder 25 Stunden hinzufuegen statt 24, weil die Funktion in Lokalzeit rechnet.
date() kann es nicht direkt — die Funktion liefert D und F immer auf Englisch. Nutze stattdessen IntlDateFormatter: (new IntlDateFormatter('de_DE', IntlDateFormatter::LONG, IntlDateFormatter::NONE))->format(new DateTimeImmutable()) ergibt 9. Juni 2024.date() und DateTime::format()?date() arbeitet immer in der globalen Default-Zeitzone, waehrend ein DateTime-Objekt eine eigene Zeitzone traegt. DateTimeImmutable ist zusaetzlich thread-sicher und veraendert sich nicht durch modify()-Aufrufe — fuer neuen Code immer DateTimeImmutable bevorzugen.date("Y-m-d H:i:s", $timestamp) oder objektorientiert (new DateTimeImmutable())->setTimestamp($timestamp)->format("Y-m-d H:i:s"). Achte auf die Zeitzone: ein Timestamp ist immer UTC-basiert, die formatierte Ausgabe ist in der eingestellten Zone.strtotime('2024-02-30') kein false zurueck?strtotime() uberlauf-tolerant ist — der 30. Februar wird als "2 Tage nach dem 28." interpretiert, also der 1. oder 2. Maerz, je nach Schaltjahr. Fuer strikte Validierung nutze DateTimeImmutable::createFromFormat('!Y-m-d', $input) mit dem fuehrenden ! und pruefe danach DateTime::getLastErrors().date() noch DateTime::add() kennen das Konzept. Pragmatischer Loop: $d = new DateTimeImmutable(); $days = 5; while ($days > 0) { $d = $d->modify('+1 day'); if ((int)$d->format('N') < 6) $days--; }. Feiertage musst du selber abziehen, weil PHP keine eingebaute Liste hat.date.timezone in der php.ini nicht gesetzt ist und PHP daher auf UTC faellt. Pruefe mit date_default_timezone_get(), was deine App nutzt, und setze global date_default_timezone_set('Europe/Berlin') im Bootstrap oder in der php.ini.