In PHP gibt es verschiedene Wege, ein Datum oder eine Uhrzeit formatiert auszugeben. Die Funktion date() ist der einfachste Weg für schnelle Ausgaben. Für Berechnungen, Zeitzonen und komplexere Szenarien bietet PHP die DateTime-Klasse. Dieses Tutorial zeigt beide Ansätze und hilft bei der Entscheidung, welcher für den jeweiligen Anwendungsfall der richtige ist.
Die date()-Funktion: Schnelle Datumsausgabe
Die Funktion date() formatiert einen Unix-Timestamp als lesbaren String. Wird kein Timestamp angegeben, verwendet sie automatisch die aktuelle Zeit:
<?php
/* Aktuelles Datum */
echo date('d.m.Y'); // z.B. 28.02.2026
echo date('H:i:s'); // z.B. 14:30:45
echo date('d.m.Y H:i'); // z.B. 28.02.2026 14:30
/* Bestimmter Timestamp */
echo date('d.m.Y', 1609459200); // 01.01.2021
?>
Der erste Parameter ist der Formatstring. Jeder Buchstabe im String hat eine besondere Bedeutung und wird durch den entsprechenden Datumswert ersetzt.
Format-Zeichen im Überblick
Die folgende Tabelle zeigt die wichtigsten Format-Zeichen, gruppiert nach Kategorie:
Tag
| Zeichen | Beschreibung | Beispiel |
d | Tag mit führender Null | 01 bis 31 |
j | Tag ohne führende Null | 1 bis 31 |
D | Wochentag, 3 Buchstaben (englisch) | Mon, Tue, Wed |
l | Wochentag ausgeschrieben (englisch) | Monday, Tuesday |
N | Wochentag als Zahl (1=Mo, 7=So) | 1 bis 7 |
Monat
| Zeichen | Beschreibung | Beispiel |
m | Monat mit führender Null | 01 bis 12 |
n | Monat ohne führende Null | 1 bis 12 |
F | Monatsname ausgeschrieben (englisch) | January, February |
M | Monatsname, 3 Buchstaben (englisch) | Jan, Feb |
t | Anzahl Tage im Monat | 28 bis 31 |
Jahr
| Zeichen | Beschreibung | Beispiel |
Y | Vierstellige Jahreszahl | 2026 |
y | Zweistellige Jahreszahl | 26 |
L | Schaltjahr (0 oder 1) | 0 |
Uhrzeit
| Zeichen | Beschreibung | Beispiel |
H | Stunde, 24h mit führender Null | 00 bis 23 |
G | Stunde, 24h ohne führende Null | 0 bis 23 |
i | Minute mit führender Null | 00 bis 59 |
s | Sekunde mit führender Null | 00 bis 59 |
U | Unix-Timestamp | 1709132400 |
Alle anderen Zeichen im Formatstring werden unverändert ausgegeben. Der Punkt in d.m.Y erscheint also als Punkt zwischen Tag, Monat und Jahr.
Die Zeichen lassen sich beliebig kombinieren. Häufig verwendete Formate sind zum Beispiel:
<?php
/* Deutsches Format */
echo date('d.m.Y'); // 28.02.2026
/* ISO 8601 (für Datenbanken) */
echo date('Y-m-d'); // 2026-02-28
/* Komplett mit Uhrzeit */
echo date('d.m.Y H:i:s'); // 28.02.2026 14:30:45
/* Nur Uhrzeit */
echo date('H:i'); // 14:30
/* Wochentag und Datum (englisch) */
echo date('l, d F Y'); // Saturday, 28 February 2026
/* MySQL-kompatibel */
echo date('Y-m-d H:i:s'); // 2026-02-28 14:30:45
?>
Für deutsche Wochentage und Monatsnamen benötigt man den IntlDateFormatter, der weiter unten im Tutorial vorgestellt wird.
Die DateTime-Klasse: Flexibel und leistungsstark
Für alles über die reine Formatierung hinaus bietet PHP die DateTime-Klasse. Sie ermöglicht Berechnungen, Vergleiche und Zeitzonenkonvertierungen:
<?php
/* DateTime-Objekt erstellen */
$jetzt = new DateTime();
echo $jetzt->format('d.m.Y H:i:s');
/* Aus einem String erstellen */
$datum = new DateTime('2026-03-15 10:30:00');
echo $datum->format('d.m.Y'); // 15.03.2026
/* Prozedurale Alternative */
$datum = date_create('2026-03-15');
echo date_format($datum, 'd.m.Y');
?>
Die format()-Methode verwendet die gleichen Format-Zeichen wie die date()-Funktion. Der Vorteil: Das DateTime-Objekt kann danach weiter bearbeitet werden.
date() vs. DateTime: Wann was verwenden?
Beide Ansätze haben ihre Berechtigung. Die folgende Übersicht hilft bei der Entscheidung:
| Kriterium | date() | DateTime |
| Einfache Ausgabe | Ideal, ein Funktionsaufruf genügt | Möglich, aber Overhead durch Objekterstellung |
| Berechnungen | Umständlich mit strtotime() | Elegant mit modify() oder DateInterval |
| Zeitzonen | Nur global über date_default_timezone_set() | Pro Objekt individuell setzbar |
| Empfehlung | Für schnelle, einfache Ausgaben | Für neuen Code: Immer bevorzugen |
In modernem PHP-Code sollte man grundsätzlich DateTime oder noch besser DateTimeImmutable verwenden. Die date()-Funktion ist für einfache Einzeiler weiterhin praktisch.
DateTimeImmutable: Die sichere Alternative
DateTimeImmutable funktioniert genau wie DateTime, mit einem wichtigen Unterschied: Methoden wie modify() verändern nicht das bestehende Objekt, sondern geben ein neues zurück. Das verhindert subtile Bugs:
<?php
/* DateTime: Original wird verändert! */
$start = new DateTime('2026-03-01');
$ende = $start->modify('+7 days');
echo $start->format('d.m.Y'); // 08.03.2026 (!)
echo $ende->format('d.m.Y'); // 08.03.2026
/* Beide zeigen das gleiche Datum! */
/* DateTimeImmutable: Original bleibt */
$start = new DateTimeImmutable('2026-03-01');
$ende = $start->modify('+7 days');
echo $start->format('d.m.Y'); // 01.03.2026
echo $ende->format('d.m.Y'); // 08.03.2026
?>
In neuem Code ist DateTimeImmutable die empfohlene Wahl, weil es unbeabsichtigte Änderungen ausschließt.
Datumsarithmetik: Tage, Monate und Jahre rechnen
Mit der modify()-Methode oder DateInterval lassen sich Datumswerte flexibel berechnen:
<?php
$heute = new DateTimeImmutable();
/* Tage addieren und subtrahieren */
$morgen = $heute->modify('+1 day');
$gestern = $heute->modify('-1 day');
$naechste_woche = $heute->modify('+7 days');
$in_30_tagen = $heute->modify('+30 days');
/* Mit DateInterval */
$interval = new DateInterval('P3M'); // 3 Monate
$in_3_monaten = $heute->add($interval);
/* Letzten Montag berechnen */
$letzter_mo = $heute->modify('last Monday');
echo $letzter_mo->format('d.m.Y');
?>
Alter berechnen
Die Methode diff() berechnet die Differenz zwischen zwei Datumsobjekten. Damit lässt sich zum Beispiel das Alter einer Person ermitteln:
<?php
$geburtsdatum = new DateTimeImmutable('1990-05-15');
$heute = new DateTimeImmutable();
$differenz = $heute->diff($geburtsdatum);
echo 'Alter: ' . $differenz->y . ' Jahre';
echo $differenz->format('%y Jahre, %m Monate');
?>
Das DateInterval-Objekt aus diff() enthält die Eigenschaften y (Jahre), m (Monate), d (Tage), h (Stunden), i (Minuten) und s (Sekunden). Die Eigenschaft days gibt die Gesamtzahl der Tage als absolute Zahl zurück, was besonders für Countdown-Berechnungen nützlich ist.
Datumsbereiche mit DatePeriod
Mit DatePeriod kann man über einen Zeitraum iterieren, zum Beispiel um alle Tage zwischen zwei Daten aufzulisten:
<?php
$start = new DateTimeImmutable('2026-03-01');
$ende = new DateTimeImmutable('2026-03-08');
$schritt = new DateInterval('P1D'); // 1 Tag
$zeitraum = new DatePeriod($start, $schritt, $ende);
foreach ($zeitraum as $tag) {
echo $tag->format('d.m.Y (D)') . PHP_EOL;
}
/* 01.03.2026 (Sun)
02.03.2026 (Mon)
...
07.03.2026 (Sat) */
?>
DatePeriod ist ideal für Kalenderansichten, Berichtszeilen oder Schichtpläne, bei denen man jeden einzelnen Tag eines Zeitraums verarbeiten muss.
Zeitzonen richtig handhaben
PHP arbeitet standardmäßig mit der Zeitzone, die in der php.ini unter date.timezone eingestellt ist. Auf Shared-Hosting-Servern ist das oft UTC oder Europe/Berlin. Wer eine Anwendung für Nutzer in verschiedenen Zeitzonen entwickelt, muss die Zeitzone im Code explizit setzen, damit Datumsangaben korrekt angezeigt werden. Die Funktion date_default_timezone_set() setzt die Zeitzone global für alle folgenden Datumsoperationen. Besser ist es jedoch, die Zeitzone pro DateTime-Objekt über den Konstruktor oder setTimezone() zu setzen, um unbeabsichtigte Seiteneffekte in anderen Teilen der Anwendung zu vermeiden.
Zeitzonen sind einer der häufigsten Stolpersteine bei der Arbeit mit Datumswerten. PHP bietet dafür die Klasse DateTimeZone:
<?php
/* Standard-Zeitzone setzen */
date_default_timezone_set('Europe/Berlin');
/* Zeitzone pro Objekt festlegen */
$berlin = new DateTimeImmutable(
'now',
new DateTimeZone('Europe/Berlin')
);
$tokyo = new DateTimeImmutable(
'now',
new DateTimeZone('Asia/Tokyo')
);
echo 'Berlin: ' . $berlin->format('H:i');
echo 'Tokyo: ' . $tokyo->format('H:i');
/* Zeitzone eines Objekts ändern */
$utc = $berlin->setTimezone(
new DateTimeZone('UTC')
);
echo 'UTC: ' . $utc->format('H:i');
?>
Als Best Practice sollte man Datumswerte intern immer in UTC speichern und erst bei der Ausgabe in die lokale Zeitzone umrechnen. So vermeidet man Probleme bei der Sommerzeit-Umstellung.
Unix-Timestamps verstehen
Ein Unix-Timestamp ist die Anzahl der Sekunden seit dem 1. Januar 1970 (UTC). Viele PHP-Funktionen arbeiten intern mit Timestamps:
<?php
/* Aktueller Timestamp */
echo time(); // z.B. 1772236800
/* Timestamp aus einem String */
echo strtotime('2026-03-15'); // 1773795200
echo strtotime('+7 days'); // in 7 Tagen
echo strtotime('next Monday'); // nächster Montag
/* Timestamp in lesbares Datum */
echo date('d.m.Y', 1609459200); // 01.01.2021
/* DateTime aus Timestamp */
$dt = new DateTimeImmutable();
$dt = $dt->setTimestamp(1609459200);
echo $dt->format('d.m.Y'); // 01.01.2021
?>
strtotime() ist besonders praktisch für relative Zeitangaben. Die Funktion versteht englische Ausdrücke wie next Monday, +3 months oder last day of December 2026.
Lokalisierte Datumsausgabe
Die Funktionen date() und DateTime::format() geben Wochentage und Monatsnamen immer auf Englisch aus. Für deutschsprachige Projekte ist das oft nicht ausreichend. Seit PHP 8.1 steht die Klasse IntlDateFormatter zur Verfügung, die Datumsangaben in jeder beliebigen Sprache formatieren kann. Sie basiert auf der ICU-Bibliothek und berücksichtigt automatisch länderspezifische Konventionen wie die Reihenfolge von Tag, Monat und Jahr.
Die Funktionen date() und DateTime::format() geben Wochentage und Monate nur auf Englisch aus. Für deutsche Ausgaben gibt es den IntlDateFormatter:
<?php
$datum = new DateTimeImmutable('2026-03-15');
$formatter = new IntlDateFormatter(
'de_DE',
IntlDateFormatter::FULL,
IntlDateFormatter::NONE
);
echo $formatter->format($datum);
// Sonntag, 15. März 2026
/* Eigenes Format */
$formatter = new IntlDateFormatter(
'de_DE',
IntlDateFormatter::NONE,
IntlDateFormatter::NONE,
null,
null,
'EEEE, d. MMMM yyyy'
);
echo $formatter->format($datum);
// Sonntag, 15. März 2026
?>
Der IntlDateFormatter benötigt die PHP-Erweiterung intl, die auf den meisten Servern verfügbar ist. Für einfache Fälle kann man auch ein eigenes Array mit deutschen Monatsnamen verwenden.
Praxisbeispiel: Ablaufdatum und Countdown
Ein häufiges Szenario: Man möchte berechnen, wie viele Tage bis zu einem bestimmten Datum verbleiben, etwa für ein Ablaufdatum oder einen Event-Countdown:
<?php
$heute = new DateTimeImmutable();
$event = new DateTimeImmutable('2026-12-24');
$diff = $heute->diff($event);
if ($diff->invert === 0) {
echo 'Noch ' . $diff->days . ' Tage bis Weihnachten.';
} else {
echo 'Weihnachten war vor ' . $diff->days . ' Tagen.';
}
/* Ablaufdatum berechnen */
$registrierung = new DateTimeImmutable();
$ablauf = $registrierung->modify('+30 days');
echo 'Account gültig bis: ';
echo $ablauf->format('d.m.Y');
$rest = $heute->diff($ablauf);
if ($rest->days <= 7 && $rest->invert === 0) {
echo 'Achtung: Nur noch ' . $rest->days . ' Tage!';
}
?>
Verwandte Tutorials
Weitere Tutorials rund um Datum und Zeit in PHP:
Häufige Fragen zur Datumsformatierung
Die folgenden Fragen tauchen bei der Arbeit mit Datums- und Zeitfunktionen in PHP besonders häufig auf. Sie decken typische Stolperfallen ab und helfen, gängige Fehler zu vermeiden.
Die wichtigsten Fragen im Überblick:
Wie gebe ich das aktuelle Datum auf Deutsch aus? Die Funktion date() gibt Wochentage und Monate nur auf Englisch aus. Für deutsche Ausgaben verwendet man den IntlDateFormatter mit dem Locale de_DE. Ein Beispiel dafür findet sich im Abschnitt zur lokalisierten Datumsausgabe weiter oben.
Was ist der Unterschied zwischen DateTime und DateTimeImmutable? DateTime verändert das bestehende Objekt bei Methoden wie modify(). DateTimeImmutable gibt stattdessen ein neues Objekt zurück und lässt das Original unverändert. Für neuen Code ist DateTimeImmutable die sicherere Wahl.
Wie speichere ich Datumswerte in einer Datenbank? Am besten als DATETIME- oder TIMESTAMP-Spalte in UTC. Beim Speichern: $datum->format('Y-m-d H:i:s'). Beim Lesen: new DateTimeImmutable($row['datum']). Die Umrechnung in die lokale Zeitzone erfolgt erst bei der Ausgabe.
Warum zeigt date() die falsche Uhrzeit an? Vermutlich ist die falsche Zeitzone eingestellt. Mit date_default_timezone_set('Europe/Berlin') am Anfang des Scripts oder über die php.ini-Einstellung date.timezone lässt sich das korrigieren.