PHP Date
PHP-Datumsfunktionen sind für Entwickler unverzichtbar, wenn es darum geht, Datumsangaben und Zeiten zu verarbeiten und anzuzeigen.
Einführung
Fast jede Anwendung muss Datumsangaben lesen, formatieren oder damit rechnen: Log-Einträge, „vor 3 Tagen gepostet"-Labels, Terminplanung, Ablaufprüfungen. PHP bietet dafür zwei parallele Werkzeugsets:
- Prozedurale Funktionen rund um den Unix-Timestamp — eine Ganzzahl, die die Sekunden seit dem 1. Januar 1970, 00:00:00 UTC zählt.
time(),date(),strtotime()undmktime()gehören dazu. - Die objektorientierte
DateTime-API —DateTime,DateTimeImmutable,DateTimeZoneundDateInterval— die für Arithmetik und Zeitzonenhandhabung sicherer ist.
Diese Seite behandelt die am häufigsten verwendeten Funktionen und Klassen, wann man welche wählt und den Zeitzonenfehler, über den fast jeder stolpert.
Hinweis zu Zeitzonen
Standardmäßig verwendet PHP die in php.ini konfigurierte Zeitzone (die Einstellung date.timezone). Ist diese nicht gesetzt, können die Ergebnisse je nach Server unterschiedlich ausfallen. Legen Sie sie am Anfang Ihres Skripts explizit fest oder übergeben Sie jedem Objekt eine DateTimeZone:
date_default_timezone_set('UTC');Siehe PHP Timezones für die vollständige Liste gültiger Bezeichner und wie man zwischen Zonen konvertiert.
Die Funktion date()
date(string $format, ?int $timestamp = null) formatiert einen Timestamp in einen menschenlesbaren String. Wird der Timestamp weggelassen, wird die aktuelle Zeit verwendet. Dies ist die wichtigste Funktion zur Datumsanzeige.
echo date('Y-m-d H:i:s'); // e.g. 2023-10-25 14:30:00
echo date('l, F j, Y'); // e.g. Wednesday, October 25, 2023Der format-String wird aus einstelligen Platzhaltern aufgebaut. Die gebräuchlichsten:
| Zeichen | Bedeutung | Beispiel |
|---|---|---|
Y | 4-stelliges Jahr | 2023 |
m | Monat, mit führender Null | 10 |
d | Tag des Monats, mit führender Null | 25 |
H | Stunde, 24h, mit führender Null | 14 |
i | Minuten, mit führender Null | 30 |
s | Sekunden, mit führender Null | 00 |
l | Vollständiger Wochentagsname | Wednesday |
F | Vollständiger Monatsname | October |
Um einen Buchstaben auszugeben, der auch ein Formatzeichen ist, maskieren Sie ihn mit einem Backslash: date('\T\o\d\a\y: Y-m-d').
Die Funktion time()
time() gibt den aktuellen Unix-Timestamp als Ganzzahl zurück. Verwenden Sie ihn, wenn Sie ein numerisches „Jetzt" zum Speichern, Vergleichen oder Rechnen benötigen.
$now = time();
echo $now; // an integer such as 1698241800
// One hour from now:
echo date('Y-m-d H:i:s', $now + 3600);Da ein Timestamp nur eine Ganzzahl von Sekunden ist, können Sie Zeitspannen direkt addieren oder subtrahieren (+ 3600 für eine Stunde, + 86400 für einen Tag). Für alles Komplexere als ein paar feste Offsets empfiehlt sich die DateTime-Arithmetik weiter unten.
Die Funktion strtotime()
strtotime(string $datetime, ?int $baseTimestamp = null) wandelt einen englischsprachigen Datums-/Zeittext in einen Timestamp um und gibt bei Fehler false zurück. Die Funktion versteht sowohl absolute Strings als auch relative Ausdrücke.
echo strtotime('2023-10-25 14:30:00'); // 1698244200 (UTC)
echo "\n";
var_dump(strtotime('next monday')); // a future timestamp, or false if unparseable$tomorrow = strtotime('+1 day');
echo date('Y-m-d', $tomorrow);Prüfen Sie das Ergebnis immer auf false, bevor Sie es verwenden, da ein Tippfehler lautlos scheitert, statt eine Ausnahme zu werfen.
Die Funktion mktime()
mktime(int $hour, int $minute, int $second, int $month, int $day, int $year) erstellt einen Timestamp aus einzelnen Komponenten. Beachten Sie, dass die Argumentreihenfolge zuerst die Zeit und dann das Datum ist.
$timestamp = mktime(0, 0, 0, 12, 31, 2023);
echo date('Y-m-d', $timestamp); // 2023-12-31mktime() normalisiert Werte außerhalb des gültigen Bereichs, was praktisch ist: mktime(0, 0, 0, 13, 1, 2023) rollt „Monat 13" in den Januar 2024 um.
Die Klasse DateTime
new DateTime(string $datetime = 'now', ?DateTimeZone $timezone = null) kapselt ein Datum in einem Objekt, das Sie mit Methodenaufrufen formatieren, vergleichen und verändern können. (Die Funktion date_create() ist ein prozeduraler Alias für denselben Konstruktor.)
$date = new DateTime('2023-10-25', new DateTimeZone('UTC'));
echo $date->format('Y-m-d'); // 2023-10-25DateTime ist veränderbar — Methoden wie modify() ändern das Objekt direkt. Das führt zu subtilen Fehlern, wenn ein Objekt gemeinsam genutzt wird, weshalb die unveränderliche Version weiter unten in der Regel bevorzugt wird.
Die Klasse DateTimeImmutable
DateTimeImmutable hat dieselbe API wie DateTime, aber jede verändernde Methode gibt ein neues Objekt zurück und lässt das Original unverändert. Für modernen Code ist dies die sicherere Standardwahl.
$date = new DateTimeImmutable('2023-10-25');
$newDate = $date->modify('+1 day');
echo $date->format('Y-m-d'); // 2023-10-25 (unchanged)
echo "\n";
echo $newDate->format('Y-m-d'); // 2023-10-26Die Methode DateTime::format()
format(string $format) wandelt ein DateTime- oder DateTimeImmutable-Objekt in einen String um. Sie akzeptiert dieselben Formatzeichen wie die Funktion date().
$date = new DateTimeImmutable('2023-10-25 14:30:00');
echo $date->format('l, F j, Y'); // Wednesday, October 25, 2023Datumsarithmetik und Differenzen
Die objektorientierte API glänzt bei der Arithmetik. Verwenden Sie DateInterval (ISO-8601-Dauerstrings) zum Addieren oder Subtrahieren und diff() zum Vergleichen zweier Datumsangaben:
$start = new DateTimeImmutable('2023-10-25');
$later = $start->add(new DateInterval('P10D')); // P10D = 10 days
echo $later->format('Y-m-d'); // 2023-11-04
$diff = $start->diff(new DateTimeImmutable('2023-12-31'));
echo "\n" . $diff->days . ' days apart'; // 67 days apartDas richtige Werkzeug wählen
- Schnell ein formatiertes „Jetzt" benötigt? Verwenden Sie
date(). - Einen Zeitpunkt numerisch speichern oder vergleichen? Verwenden Sie
time()/ Unix-Timestamps. - Benutzer- oder Log-Eingaben parsen? Verwenden Sie
strtotime()(und prüfen Sie auffalse). - Arithmetik, Differenzen oder Zeitzonenkonvertierungen? Verwenden Sie
DateTimeImmutablemitDateInterval.
Häufige Fallstricke
- Nicht gesetzte Zeitzone. Ohne
date_default_timezone_set()oder einenphp.ini-Wert variieren die Ergebnisse je nach Server. Setzen Sie die Zeitzone einmal, frühzeitig. strtotime()gibtfalsezurück bei unbekannten Strings — die Funktion wirft keine Ausnahme, prüfen Sie das Ergebnis also immer.DateTimeist veränderbar.modify()ändert das Original; greifen Sie aufDateTimeImmutablezurück, um Überraschungen durch gemeinsam genutzten Zustand zu vermeiden.- Timestamps sind UTC-Sekunden. Ihre Formatierung mit
date()wendet die aktuelle Zeitzone an, sodass dieselbe Ganzzahl je nach Einstellung unterschiedlich dargestellt wird.
Fazit
PHP bietet Ihnen ein prozedurales Timestamp-Werkzeugset (date(), time(), strtotime(), mktime()) und ein objektorientiertes (DateTime, DateTimeImmutable). Nutzen Sie einfache Timestamps für die schlichte Anzeige und Speicherung und DateTimeImmutable für Arithmetik und zeitzonenbewusste Logik. Für tiefere Einblicke siehe PHP Date and Time, die Referenz zu date(), strtotime() und mktime().