PHP date() & strtotime()

Interaktive Referenz: Format-Strings testen, Parameter nachschlagen und strtotime()-Ausdrücke ausprobieren.

date(" ")
{{ dateResult }}
<?php echo date("{{ dateFormat }}"); ?>
{{ __t('th_character') }} {{ __t('th_description') }} {{ __t('th_example') }}
strtotime(" ")
{{ strtotimeResult.timestamp }}
{{ strtotimeResult.formatted }}
{{ strtotimeResult.relative }}
{{ strtotimePhpCode }}
{{ __t('alert_expression_not_recognized') }}
{{ cat.title }}
{{ __t('th_expression') }} {{ __t('th_description') }} {{ __t('label_result') }}
{{ ref.expr }} {{ ref.desc }} {{ getStrtotimeExample(ref.expr) }}

PHP date() — Format-Parameter

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).

PHP strtotime() — Relative Zeitangaben

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".

Wie date() intern arbeitet

date(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().

Die wichtigsten Format-Buchstaben

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).

  • Tag: d (01-31, mit Null), j (1-31, ohne Null), D (Mon-Sun), l (Monday-Sunday), N (1-7 ISO-Wochentag).
  • Monat: m (01-12), n (1-12), M (Jan-Dec), F (January-December), t (Tage im Monat, 28-31).
  • Jahr: Y (2024), y (24), o (ISO-8601-Wochen-Jahr — Achtung an Jahresgrenzen), L (1 wenn Schaltjahr).
  • Zeit: 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).
  • Zeitzone & Composites: e (Europe/Berlin), O (+0200), P (+02:00), T (CEST), c (ISO 8601), r (RFC 2822), U (Unix-Sekunden).

Häufige Formate

  • date("Y-m-d") — ISO-Datum: 2025-03-15
  • date("d.m.Y") — Deutsches Format: 15.03.2025
  • date("Y-m-d H:i:s") — MySQL Datetime
  • date("c") — ISO 8601: 2025-03-15T14:30:00+01:00
  • date("r") — RFC 2822: Sat, 15 Mar 2025 14:30:00 +0100
  • date("U") — Unix-Timestamp

Konkrete Beispiele aus dem PHP-Alltag

Diese 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).

Bekannte Fallstricke

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.

Haeufige Fragen zu PHP-Datumsausgaben

Wie bekomme ich das aktuelle Datum auf Deutsch?
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.
Was ist der Unterschied zwischen date() und DateTime::format()?
Format-Buchstaben sind identisch. Aber 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.
Wie konvertiere ich einen Unix-Timestamp in ein Datum?
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.
Warum gibt strtotime('2024-02-30') kein false zurueck?
Weil 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().
Wie addiere ich Werktage statt Kalendertage?
Weder 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.
Warum zeigt das Datum die falsche Zeitzone?
In 99 % der Faelle, weil 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.

Verwandte Tools