W3docs

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() und mktime() gehören dazu.
  • Die objektorientierte DateTime-APIDateTime, DateTimeImmutable, DateTimeZone und DateInterval — 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, 2023

Der format-String wird aus einstelligen Platzhaltern aufgebaut. Die gebräuchlichsten:

ZeichenBedeutungBeispiel
Y4-stelliges Jahr2023
mMonat, mit führender Null10
dTag des Monats, mit führender Null25
HStunde, 24h, mit führender Null14
iMinuten, mit führender Null30
sSekunden, mit führender Null00
lVollständiger WochentagsnameWednesday
FVollständiger MonatsnameOctober

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-31

mktime() 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-25

DateTime 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-26

Die 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, 2023

Datumsarithmetik 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 apart

Das 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 auf false).
  • Arithmetik, Differenzen oder Zeitzonenkonvertierungen? Verwenden Sie DateTimeImmutable mit DateInterval.

Häufige Fallstricke

  • Nicht gesetzte Zeitzone. Ohne date_default_timezone_set() oder einen php.ini-Wert variieren die Ergebnisse je nach Server. Setzen Sie die Zeitzone einmal, frühzeitig.
  • strtotime() gibt false zurück bei unbekannten Strings — die Funktion wirft keine Ausnahme, prüfen Sie das Ergebnis also immer.
  • DateTime ist veränderbar. modify() ändert das Original; greifen Sie auf DateTimeImmutable zurü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().

Übung

Übung
Was macht die PHP-Funktion 'date'?
Was macht die PHP-Funktion 'date'?
Was this page helpful?