Die prozedurale Arbeit mit date(), strtotime() und mktime() funktioniert, stößt aber bei komplexeren Anforderungen schnell an ihre Grenzen. Seit PHP 5.2 bietet die DateTime-Klasse einen objektorientierten Ansatz, der Datumswerte in einem eigenständigen Objekt kapselt. Methoden wie format(), modify() und diff() machen den Code lesbarer, Zeitzonen lassen sich sauber verwalten, und mit DateTimeImmutable steht eine Variante ohne Seiteneffekte zur Verfügung. Dieses Tutorial zeigt, wie du DateTime-Objekte erzeugst, formatierst, manipulierst und vergleichst.

Alles beginnt mit dem Erzeugen eines DateTime-Objekts, das als Ausgangspunkt für alle weiteren Operationen dient.
Ein DateTime-Objekt erzeugen
Bevor ein Datum formatiert oder berechnet werden kann, muss ein DateTime-Objekt erzeugt werden. PHP bietet dafür zwei Wege: den Konstruktor mit new DateTime() und die statische Methode DateTime::createFromFormat().
new DateTime und der Konstruktor
Der Konstruktor akzeptiert einen optionalen Datumsstring. Wird kein Argument übergeben, verwendet PHP automatisch das aktuelle Datum mit der aktuellen Uhrzeit. Neben ISO-8601-Formaten versteht der Konstruktor auch relative Angaben wie "next Friday" oder "+3 days" sowie Unix-Timestamps mit vorangestelltem @-Zeichen.
<?php
$jetzt = new DateTime();
$bestimmtesDatum = new DateTime('2025-06-15');
$ausDeutschem = DateTime::createFromFormat('d.m.Y', '15.06.2025');
Wichtig: Wenn der übergebene String kein gültiges Datum enthält, wirft der Konstruktor eine Exception. Das ermöglicht eine saubere Fehlerbehandlung mit try/catch, anders als die prozedurale Funktion date_create(), die bei ungültigen Eingaben lediglich false zurückgibt.
DateTime::createFromFormat
Nicht immer liegen Datumsangaben in einem Standardformat vor. Wenn Nutzereingaben aus Formularen, CSV-Dateien oder externen APIs in Formaten wie "15.06.2025" oder "06/15/2025" ankommen, kann der Konstruktor diese nicht zuverlässig interpretieren. Die statische Methode createFromFormat() löst dieses Problem, indem sie das erwartete Format als ersten Parameter entgegennimmt.
Die Methode gibt bei Erfolg ein DateTime-Objekt zurück. Stimmt der String nicht mit dem angegebenen Format überein, ist das Ergebnis false. Eine Prüfung des Rückgabewerts ist daher immer ratsam.
Datum und Uhrzeit formatieren
Nach dem Erzeugen eines DateTime-Objekts ist die formatierte Ausgabe der häufigste Anwendungsfall. PHP stellt dafür die Methode format() bereit, die einen Formatierungsstring entgegennimmt und das Datum als lesbaren Text zurückgibt.
Die format-Methode und Formatzeichen
Die format()-Methode arbeitet mit denselben Formatzeichen wie die prozedurale Funktion date(). Die wichtigsten Zeichen sind:
Y steht für die vierstellige Jahreszahl (z.B. 2025) m steht für den Monat mit führender Null (01 bis 12) d steht für den Tag mit führender Null (01 bis 31) H steht für die Stunde im 24-Stunden-Format (00 bis 23) i steht für Minuten mit führender Null (00 bis 59) s steht für Sekunden mit führender Null (00 bis 59) W steht für die ISO-8601-Kalenderwoche (01 bis 53)
<?php
$datum = new DateTime('2025-06-15 14:30:00');
echo $datum->format('d.m.Y'); /* 15.06.2025 */
echo $datum->format('H:i'); /* 14:30 */
echo $datum->format('l, d. F Y'); /* Sunday, 15. June 2025 */
echo $datum->format('W'); /* Kalenderwoche */
Die Kombination aus Formatzeichen und festen Trennzeichen wie Punkten, Leerzeichen oder Kommata erlaubt nahezu jede gewünschte Darstellung. Für die Speicherung in Datenbanken empfiehlt sich das ISO-Format 'Y-m-d H:i:s', für die Anzeige im deutschsprachigen Raum das Format 'd.m.Y'.
DateTime manipulieren
Datumswerte müssen häufig verändert werden, etwa um eine Lieferfrist zu berechnen, ein Ablaufdatum zu setzen oder einen Zeitraum zu verschieben. Die DateTime-Klasse bietet dafür mehrere Methoden.
modify und add/sub
Die Methode modify() akzeptiert relative Datumsangaben als String. Diese Angaben folgen derselben Syntax, die auch strtotime() versteht.
<?php
$datum = new DateTime('2025-06-15');
$datum->modify('+7 days');
echo $datum->format('d.m.Y'); /* 22.06.2025 */
$datum->modify('-1 month');
echo $datum->format('d.m.Y'); /* 22.05.2025 */
Ein wichtiger Stolperstein: DateTime ist mutable. Der Aufruf von modify() verändert das bestehende Objekt, anstatt ein neues zu erzeugen. Wer den ursprünglichen Wert behalten möchte, muss vorher eine Kopie mit clone erstellen oder auf DateTimeImmutable umsteigen.
Vorsicht ist auch bei Monatsberechnungen geboten. Der Ausdruck "+1 month" auf den 31. Januar angewendet ergibt nicht den 28. Februar, sondern den 3. März. PHP zählt 31 Tage weiter, was zu unerwarteten Ergebnissen führen kann.
DateInterval nutzen
Alternativ zu modify() bieten die Methoden add() und sub() eine typsichere Möglichkeit, Zeitintervalle zu verarbeiten. Beide erwarten ein DateInterval-Objekt, das im ISO-8601-Intervallformat angegeben wird. Dabei steht P für den Beginn der Periodendefinition, gefolgt von Zahlenwerten mit Einheiten wie Y (Jahre), M (Monate), D (Tage), und nach dem Buchstaben T die Zeitangaben H (Stunden), M (Minuten) und S (Sekunden). So steht beispielsweise P1Y2M3D für ein Intervall von einem Jahr, zwei Monaten und drei Tagen. Der Vorteil gegenüber modify() liegt in der klaren Trennung von Wert und Richtung: add() addiert, sub() subtrahiert.
graph TD
A[Eingabe] --> B[DateTime]
B --> C[format]
B --> D[modify / add]
B --> E[diff]
E --> F[DateInterval]
DateTime vs. DateTimeImmutable
Die Klasse DateTime ist mutable: Jede Manipulation verändert das Objekt direkt. Das kann zu schwer auffindbaren Fehlern führen, besonders wenn ein DateTime-Objekt an mehrere Funktionen übergeben oder in einer Schleife verändert wird. DateTimeImmutable löst dieses Problem, indem jede Änderung ein neues Objekt zurückgibt und das Original unangetastet bleibt.
<?php
$original = new DateTimeImmutable('2025-06-15');
$geaendert = $original->modify('+1 day');
echo $original->format('d.m.Y'); /* 15.06.2025 - unveraendert */
echo $geaendert->format('d.m.Y'); /* 16.06.2025 - neues Objekt */
Beide Klassen implementieren das DateTimeInterface. Das bedeutet, dass Funktionen und Methoden, die dieses Interface als Typ erwarten, sowohl DateTime als auch DateTimeImmutable akzeptieren. In modernem PHP-Code wird DateTimeImmutable bevorzugt, weil es Seiteneffekte zuverlässig verhindert und den Code vorhersagbarer macht.
Zeitzonen in DateTime
Zeitzonen sind unverzichtbar, sobald eine Anwendung Nutzer in verschiedenen Ländern bedient oder mit externen APIs kommuniziert. Die DateTime-Klasse arbeitet mit DateTimeZone-Objekten, die entweder im Konstruktor oder nachträglich über setTimezone() gesetzt werden können.
<?php
$berlin = new DateTimeZone('Europe/Berlin');
$datum = new DateTime('now', $berlin);
echo $datum->format('Y-m-d H:i:s T');
/* Ausgabe z.B.: 2025-06-15 14:30:00 CEST */
$datum->setTimezone(new DateTimeZone('America/New_York'));
echo $datum->format('Y-m-d H:i:s T');
/* Ausgabe z.B.: 2025-06-15 08:30:00 EDT */
Ohne explizite Angabe verwendet PHP die in der php.ini konfigurierte Standard-Zeitzone (Direktive date.timezone). Für konsistente Ergebnisse empfiehlt es sich, intern mit UTC zu arbeiten und die Zeitzone erst bei der Ausgabe für den Nutzer umzurechnen. So werden Probleme mit Sommer- und Winterzeit vermieden, und Datumswerte lassen sich zuverlässig in Datenbanken speichern.
Bei Unix-Timestamps mit @-Präfix wird die Zeitzone automatisch auf UTC gesetzt. Eine eventuell übergebene DateTimeZone wird in diesem Fall ignoriert.
DateTime-Objekte vergleichen
DateTime-Objekte können in PHP direkt mit den Vergleichsoperatoren <, >, == und != verglichen werden. Das macht Zeitvergleiche in Bedingungen besonders lesbar.
<?php
$start = new DateTime('2025-01-01');
$ende = new DateTime('2025-12-31');
if ($start < $ende) {
echo 'Start liegt vor Ende';
}
$differenz = $start->diff($ende);
echo $differenz->days . ' Tage Unterschied';
Die Methode diff() berechnet die Differenz zwischen zwei DateTime-Objekten und gibt ein DateInterval-Objekt zurück. Über dessen Eigenschaft days lässt sich die absolute Anzahl der Tage zwischen den beiden Zeitpunkten ermitteln. Weitere Eigenschaften wie y, m und d liefern die aufgegliederte Differenz in Jahren, Monaten und Tagen.
Fazit: Wann DateTime statt date() nutzen?
Die prozedurale Funktion date() genügt für einfache Formatierungen. Sobald Datumswerte jedoch berechnet, verglichen oder zwischen Zeitzonen umgerechnet werden müssen, bietet die DateTime-Klasse klare Vorteile. Der objektorientierte Ansatz kapselt Datum, Uhrzeit und Zeitzone in einem Objekt, das sich sauber weiterreichen und manipulieren lässt. Für neuen Code empfiehlt sich DateTimeImmutable als Standard, weil es unbeabsichtigte Änderungen am Originalobjekt zuverlässig ausschließt. Zusammen mit DateInterval und DateTimeZone bildet die DateTime-Familie ein vollständiges Werkzeugset für jede Anforderung rund um Datum und Uhrzeit in PHP.