date('Y-m-d') liefert das heutige Datum als String, etwa 2026-03-14. Das erste Argument ist ein Format-String, in dem jeder Buchstabe für einen Teil des Datums steht (Y das Jahr, m der Monat, d der Tag, H:i:s die Uhrzeit), und ein optionales zweites Argument ist ein Unix-Timestamp, der statt des aktuellen Moments formatiert wird.
Die Ausgabe ändert sich bei jedem Klick auf Run, weil es das aktuelle Datum und die aktuelle Uhrzeit in UTC sind. Jeder Buchstabe des Format-Strings und wie du normalen Text dazwischen setzt, steht auf der Seite zum PHP-Datumsformat.
Timestamps: time(), mktime() und strtotime()
Ein Unix-Timestamp ist die Zahl der Sekunden seit dem 1. Januar 1970 um Mitternacht UTC. time() liefert den aktuellen, mktime(hour, minute, second, month, day, year) baut einen aus Teilen, und strtotime() liest ein auf Englisch geschriebenes Datum ('2026-03-14', '+1 week', 'next monday'). Übergib einen beliebigen Timestamp als zweites Argument an date(). Das zweite Argument von strtotime() ist der Moment, ab dem eine relative Angabe zählt; ohne zählt sie ab jetzt.
Ausgabe:
1773480600
Sat, 14 Mar 2026 09:30
2027-01-01
tomorrow Sun 2026-03-15
+1 week Sat 2026-03-21
next monday Mon 2026-03-16
last day of this month Tue 2026-03-31
first monday of next month Mon 2026-04-06
bool(false)
Der Überlauf in mktime() ist nützlich: Tag 0 eines Monats ist der letzte Tag des Vormonats, also ist mktime(0, 0, 0, 3, 0, 2026) der 28. Februar. Vergleiche das Ergebnis immer mit false, bevor du es weitergibst: date('Y-m-d', false) gibt still 1970-01-01 aus, ein Datum, das niemand gemeint hat.
Tage zu einem Datum addieren
Für alles über die Ausgabe hinaus verwendest du DateTimeImmutable. Seine Methode modify() nimmt dieselben Angaben wie strtotime() und liefert ein neues Datum, und add() nimmt ein DateInterval wie P7D (ein Zeitraum von 7 Tagen) oder PT90M (90 Minuten).
Ausgabe:
2026-03-21
2026-03-13
2026-04-14
11:00
2025-03-14
2026-03-03
2026-02-28
Den 31. Februar gibt es nicht, also landet +1 month vom 31. Januar aus am 3. März. Wenn du „das Ende des nächsten Monats“ meinst, sag es mit last day of next month.
DateTime vs DateTimeImmutable
DateTime ändert sich selbst, wenn du modify(), add() oder setDate() aufrufst, und liefert dasselbe Objekt zurück. Das überrascht alle, die das ursprüngliche Datum in einer Variable behalten:
Ausgabe:
2026-03-21
2026-03-21
bool(true)
2026-03-14
2026-03-21
Bevorzuge DateTimeImmutable in neuem Code. Beide Klassen haben dieselben Methoden und implementieren beide DateTimeInterface, also kann eine Funktion beide annehmen.
Differenz zwischen zwei Daten
diff() liefert ein DateInterval. Seine Eigenschaft days ist die Gesamtzahl der Tage zwischen den beiden Daten, während y, m und d den Abstand in Jahre, Monate und Tage aufteilen, genau das, was eine Altersberechnung braucht. Ändere die Daten und führe den Code erneut aus:
Ausgabe:
Age: 35
Exactly: 35 years, 7 months, 22 days
Days alive: 13021
286 days to go
9 months and 11 days
-286 days
In format() ist %a die Gesamtzahl der Tage und %d nur der Tagesanteil, also verwendest du %a für „Tage bis“. Um zwei Daten ohne Differenz zu vergleichen, funktionieren die normalen Operatoren auf Datumsobjekten: $today < $christmas ist true.
Zeitzonen
date() und new DateTimeImmutable() verwenden die Standardzeitzone, die aus date.timezone in der php.ini kommt (UTC, wenn sie nicht gesetzt ist). Setze sie für das ganze Skript mit date_default_timezone_set(), oder gib einem einzelnen Datum seine eigene DateTimeZone und wandle mit setTimezone() um:
Ausgabe:
Asia/Tokyo 2026-03-14 18:30 JST +09:00
Europe/Berlin 2026-03-14 10:30 CET +01:00
America/New_York 2026-03-14 05:30 EDT -04:00
Asia/Tokyo
2026-03-14 18:30
Ein Timestamp ist überall dieselbe Zahl; die Zeitzone ändert nur, wie er geschrieben wird. Deshalb lautet der übliche Rat, Daten in UTC zu speichern und bei der Anzeige umzuwandeln.
Einen Kalender auf einer Webseite zeigen
Daten werden meist in HTML ausgegeben. Dieser Block zeichnet den aktuellen Monat als Kalender und hebt den heutigen Tag hervor. Führe ihn aus und klicke dann auf Previous oder Next: Dasselbe Skript läuft erneut, mit $_GET['m'] aus dem Link, etwa ?m=2026-04.
format('N') liefert den Wochentag als 1 (Montag) bis 7 (Sonntag), also wie viele leere Zellen vor dem 1. stehen, und format('t') liefert die Anzahl der Tage im Monat. Das ! in '!Y-m' setzt jedes Feld zurück, das das Format nicht nennt, also ist der Tag der 1. und die Uhrzeit Mitternacht.
Typische Fehler mit date()
Das zweite Argument von date() muss ein Timestamp sein, kein Datums-String. Diese Zeile:
<?php
echo date('d/m/Y', '2026-03-14');
stoppt das Skript mit einem TypeError:
PHP Fatal error: Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/index.php:2
Wandle den String vorher um, mit strtotime() oder einem Objekt:
Ausgabe:
14/03/2026
14/03/2026
bool(false)
bool(true)
Zwei weitere Fallen: m ist der Monat und i sind die Minuten, also gibt 'H:m' den Monat aus, wo du Minuten wolltest; und new DateTimeImmutable('garbage') wirft eine Exception, statt false zu liefern, also packst du Nutzereingaben in try/catch oder parst sie mit DateTimeImmutable::createFromFormat(), das bei einer Abweichung false liefert.
Häufig gestellte Fragen
Wie bekomme ich in PHP das aktuelle Datum?
Rufe date() mit einem Format-String auf: echo date('Y-m-d'); gibt das heutige Datum wie 2026-03-14 aus, und date('Y-m-d H:i:s') fügt die Uhrzeit hinzu. Die Objektversion ist (new DateTimeImmutable())->format('Y-m-d').
Wie addiere ich in PHP Tage zu einem Datum?
Verwende modify() auf einem DateTimeImmutable: (new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d') ergibt 2026-03-21. Mit Timestamps macht date('Y-m-d', strtotime('+7 days', $timestamp)) dasselbe.
Wie berechne ich in PHP die Differenz zwischen zwei Daten?
Rufe diff() auf einem Datum mit dem anderen auf: $a->diff($b) liefert ein DateInterval. Seine Eigenschaft days ist die Gesamtzahl der Tage, und y, m, d enthalten Jahre, Monate und Tage, und so berechnest du das Alter einer Person.
Wie wandle ich in PHP einen Unix-Timestamp in ein Datum um?
Übergib ihn als zweites Argument an date(): date('Y-m-d H:i:s', 1773479107) liefert 2026-03-14 09:05:07 in UTC. Für ein Objekt verwendest du new DateTimeImmutable('@1773479107').
Warum zeigt PHP date() die falsche Uhrzeit?
date() verwendet die Standardzeitzone, die aus date.timezone in der php.ini kommt und oft UTC ist. Setze deine eigene mit date_default_timezone_set('Europe/Berlin') am Anfang des Skripts oder übergib eine DateTimeZone an DateTimeImmutable.