Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 Unit Test Generator
 TLD Liste
 Webkatalog‑Verzeichnis

Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
 
 
 

Die Funktion date() in PHP

Sie befinden sich: Home > Php > Die Funktion date() in PHP

Möchte man unter PHP ein Datum ausgeben, steht dafür die Funktion date() zur Verfügung. Der Syntax beinhaltet zwei Parameter, wobei der zweite Parameter nicht unbedingt angegeben werden muss.

Ein Beispiel sollte den Gebrauch verdeutlichen und zeigen, dass die Funktion durch die Angabe eines Formates für das Datum sehr flexibel gestaltet werden kann.

Beispiel für die PHP-Funktion date():

<?php
/**
* Angenommen heute ist March 10th,
* 2001, 5:16:18 pm
* */
$heute = date("F j, Y, g:i a");
echo $heute.'<br>';
/* Ausgabe: March 10, 2001, 5:16 pm */

$heute = date("m.d.y");
echo $heute.'<br>';
/* Ausgabe: 03.10.01 */

$heute = date("d.m.Y \\u\\m H:i \\U\\h\\r");
echo $heute.'<br>';
/* Ausgabe: 10.03.2001 um 17:16 Uhr */

$heute = date("j, n, Y");
echo $heute.'<br>';
/* Ausgabe: 10, 3, 2001 */

$heute = date("Ymd");
echo $heute.'<br>';
/* Ausgabe: 20010310 */

$heute = date('h-i-s, j-m-y, it is w Day z ');
echo $heute.'<br>';
/* Ausgabe: 05-16-17, 10-03-01, 1631 1617 6 Satpm01 68 */

$heute = date("D M j G:i:s T Y");
echo $heute.'<br>';
/* Ausgabe: Sat Mar 10 15:16:08 MST 2001 */

$heute = date("H:i:s \m ") . " ist der Formatbuchstabe für Minuten";
echo $heute.'<br>';
/* Ausgabe: 17:16:17 m ist der Formatbuchstabe für Minuten */
/* Hinweis: 'i' steht für Minuten, 'm' für den Monat! */

$heute = date("H:i:s");
echo $heute.'<br>';
/* Ausgabe: 17:16:17 */
?>

Formatparameter von der PHP-Funktion: date()

Die Vielzahl von Parametern ist für Neulinge im Bereich der Programmierung oftmals nicht überschaubar. Nachfolgende Tabelle zeigt die wohl am häufigsten verwendeten Formatparameter.

Format   Bedeutung
g = 12-Stunden-Format, ohne führende Nullen (1 bis 12)
G = 24-Stunden-Format, ohne führende Nullen (0 bis 23)
h = 12-Stunden-Format, mit führenden Nullen (01 bis 12)
H = 24-Stunden-Format, mit führenden Nullen (00 bis 23)
i = Minuten mit führenden Nullen (00 bis 59)
s = Sekunden, mit führenden Nullen (00 bis 59)
T = Zeitzoneneinstellung des Rechners (Beispiele: EST, MDT …)
c = ISO 8601 Datum (seit PHP 5 verfügbar) (2004-02-12T15:19:21+00:00)
d = Tag des Monats, 2-stellig, mit führender Null (01 bis 31)
j = Tag des Monats ohne führende Nullen (1 bis 31)
Y = Vierstellige Jahreszahl (1999 oder 2003)
y = Jahreszahl, zweistellig (99 oder 03)
z = Der Tag eines Jahres (0 bis 365)
t = Anzahl der Tage des angegebenen Monats (28 bis 31)

 

Soll nun unter anderem die aktuelle Uhrzeit angegeben werden, müssen nur die oben aufgeführten Formate dafür sinnvoll kombiniert werden.

<?php
echo date(" H:i:s:T ");
/* z.B.: 15:23:45:EST */
?>
 

Wenn sichekt ein Text in die date() Funktion eingesetzen werden soll, muss jedes Zeichen durch einen vorangestellten Backslash ( \ ) „escaped“ werden, damit der Buchstabe gegebenenfalls nicht als Format des Datums interpretiert wird.

Wie kann ich die Zeitzone verändern?

Die PHP Funktion date_default_timezone_set() wird verwendet, um die Standardzeitzone für eine Datei oder ein Skript zu setzen. Mit dieser Funktion kann man festlegen, welche Zeitzone für alle Datumsfunktionen in der Skript-Datei verwendet werden soll. 

Beispiel 1: Wir können die Standardzeitzone auf Europa/Berlin setzen, indem wir folgenden Code verwenden: 

<?php
date_default_timezone_set('Europe/Berlin');
?>

Beispiel 2: Wir können auch die Standardzeitzone auf America/New_York setzen, indem wir folgenden Code verwenden:

<?php
date_default_timezone_set('America/New_York');
?>

Es kann Vorteile haben, zwei Zeitzonen zu verwenden, da man so verschiedene Zeitzonen in einer Anwendung vergleichen und verschiedene Uhrzeiten anzeigen kann. Beispielsweise kann eine Anwendung die Uhrzeit in einer Zeitzone anzeigen und gleichzeitig die Uhrzeit im Zielmarkt anzeigen. Dies kann beim Verwalten von Terminen oder beim Einrichten von Konferenzanrufen nützlich sein.

UTC als Basis für internationale Anwendungen

In Webanwendungen mit internationalen Nutzern empfiehlt es sich, intern durchgängig mit UTC (Coordinated Universal Time) zu arbeiten. UTC ist die Referenzzeit ohne Sommer- oder Winterzeitverschiebung. Timestamps werden in UTC in der Datenbank gespeichert und erst bei der Ausgabe in die jeweilige lokale Zeitzone des Nutzers umgerechnet.

<?php
/* Datum in UTC speichern */
$utc = new DateTimeImmutable('now', new DateTimeZone('UTC'));
$dbWert = $utc->format('Y-m-d H:i:s');
/* z.B.: 2026-02-17 13:45:00 */

/* Für die Anzeige in die lokale Zeitzone umwandeln */
$lokal = $utc->setTimezone(new DateTimeZone('Europe/Berlin'));
echo $lokal->format('d.m.Y H:i');
/* z.B.: 17.02.2026 14:45 (UTC+1 im Winter) */
?>

Die Methode setTimezone() ändert die Zeitzone, ohne den tatsächlichen Zeitpunkt zu verändern – lediglich die Darstellung wird angepasst. Bei DateTimeImmutable wird dabei ein neues Objekt zurückgegeben, das Original bleibt unverändert.

Eine Liste aller unterstützten Zeitzonen erhalten Sie mit der Funktion DateTimeZone::listIdentifiers(). Die für den deutschsprachigen Raum relevanten Zeitzonen sind Europe/Berlin, Europe/Vienna und Europe/Zurich.

Mit der Funktion date() werden Monatsnamen immer auf Englisch dargestellt. Wichtig: Die Funktion setlocale() hat keinen Einfluss auf die Ausgabe von date(). Um Monatsnamen in einer anderen Sprache darzustellen, verwenden Sie die Klasse IntlDateFormatter:

<?php
$formatter = new IntlDateFormatter(
    'de_DE',
    IntlDateFormatter::LONG,
    IntlDateFormatter::NONE
);
echo $formatter->format(time());
/* z.B.: 16. Februar 2026 */
?>

Der IntlDateFormatter unterstützt verschiedene Detailstufen für Datum und Uhrzeit. Die Konstanten FULL, LONG, MEDIUM und SHORT steuern den Umfang der Ausgabe. Alternativ können Sie mit einem eigenen Pattern arbeiten:

<?php
/* Datum mit Wochentag auf Deutsch */
$formatter = new IntlDateFormatter(
    'de_DE',
    IntlDateFormatter::FULL,
    IntlDateFormatter::SHORT
);
echo $formatter->format(time());
/* z.B.: Dienstag, 17. Februar 2026 um 14:30 */

/* Eigenes Pattern: nur Monat und Jahr */
$formatter2 = new IntlDateFormatter(
    'de_DE',
    IntlDateFormatter::NONE,
    IntlDateFormatter::NONE,
    'Europe/Berlin',
    IntlDateFormatter::GREGORIAN,
    'MMMM yyyy'
);
echo $formatter2->format(time());
/* z.B.: Februar 2026 */
?>

Der IntlDateFormatter nutzen die ICU-Bibliothek (International Components for Unicode) und unterstützt damit über 300 Sprachen und Regionen. Er ist die zuverlässigste Methode, um Datumsangaben korrekt lokalisiert auszugeben – deutlich besser als die veraltete Funktion strftime(), die seit PHP 8.1 als deprecated markiert ist.

Eingangs wurde erwähnt, dass ein zusätzlicher Parameter an die Funktion übergeben werden kann. Hierbei handelt es sich um den sogenannten UNIX Timestamp. Dieser UNIX Timestamp ist ein Integerwert, der praktisch die verstrichenen Sekunden seit dem 01.01.1970 repräsentiert.

Um einen Timestamp in einer Variable zu speichern, wird die Funktion time() verwendet. Zum Umwandeln eines UNIX Timestamp können Sie unser UNIX Timestamp Tool verwenden, um unter anderem schnell und einfach einen Timestamp zu generieren. Nachfolgend noch ein Beispiel, wie sie mit dem PHP Befehl time() arbeiten können.

<?php
/* holt den aktuellen Timestamp
und speichert diesen in $timestamp */
$timestamp = time();

echo date("H:i:s:T", $timestamp);
/* gibt den mit time(); geholten Timestamp im
angegebenen Format aus ( z.B. 15:23:45:EST ) */
?>

Wenn Sie den Start und das Enddatums einer Woche berechnen möchten, können Sie sich das Tutorial: Start und Enddatum einer Woche ermitteln, ansehen. In diesem Tutorial wird die Berechnung über ein Timestamp realisiert, mit Zuhilfenahme von der PHP Funktion strtotime() und date().

Ein weiterer interessanter Ansatz, wie sie mit der PHP Funktion Date arbeiten, finden Sie in dem PHP Tutorial: Das Datum und Uhrzeit der letzten Änderung von einer Datei ermitteln.

Mit der PHP Funktion mktime() kann man ein Datum zu ein Timestamp umwandeln. Dieser Timestamp kann dann anschließend berechnet und wieder über die PHP-Funktion date() ausgegeben werden.

Wenn Sie das Datum und/oder die Uhrzeit formatieren wollen, können Sie die PHP-Funktion date_format() verwenden. Mit dieser Funktion können Sie das Datum und die Uhrzeit in dem gewünschten Format ausgeben.

Datum parsen mit strtotime()

Die Funktion strtotime() wandelt eine textuelle Datums- oder Zeitangabe in einen UNIX-Timestamp um. Sie versteht sowohl absolute Datumsangaben als auch relative Ausdrücke wie „next Monday“ oder „+3 days“. In der Praxis ist strtotime() eine der am häufigsten genutzenen Datumsfunktionen, weil sie natürlichsprachliche Ausdrücke in berechenbare Timestamps übersetzen. Sie eignet sich hervorragend für schnelle Datumsberechnungen, ohne zuerst ein DateTime-Objekt anlegen zu müssen.

Beispiel mit absoluten Datumsangaben:

<?php
$timestamp = strtotime('2026-03-15');
echo date('d.m.Y', $timestamp);
/* Ausgabe: 15.03.2026 */

$timestamp2 = strtotime('March 15, 2026');
echo date('d.m.Y', $timestamp2);
/* Ausgabe: 15.03.2026 */
?>

Beispiel mit relativen Datumsangaben:

<?php
echo date('d.m.Y', strtotime('+1 week'));
/* Ausgabe: Datum in einer Woche */

echo date('d.m.Y', strtotime('next Monday'));
/* Ausgabe: nächster Montag */

echo date('d.m.Y', strtotime('-3 months'));
/* Ausgabe: Datum vor drei Monaten */

echo date('d.m.Y', strtotime('last day of this month'));
/* Ausgabe: letzter Tag des aktuellen Monats */
?>

strtotime() akzeptiert einen optionalen zweiten Parameter als Bezugszeitpunkt. Ohne diesen Parameter wird die aktuelle Zeit verwendet.

<?php
$bezugsdatum = strtotime('2026-01-01');
echo date('d.m.Y', strtotime('+90 days', $bezugsdatum));
/* Ausgabe: 01.04.2026 (90 Tage nach dem 1. Januar) */
?>

Hinweis: Bei ungültigen Eingaben gibt strtotime() den Wert false zurück. Prüfen Sie daher das Ergebnis, bevor Sie es weiterverarbeiten:

<?php
$eingabe = 'kein gültiges Datum';
$timestamp = strtotime($eingabe);

if ($timestamp === false) {
    echo 'Ungültige Datumseingabe: ' . $eingabe;
} else {
    echo date('d.m.Y', $timestamp);
}
?>

Beachten Sie außerdem, dass strtotime() bei mehrdeutigen Formaten wie 01/02/2026 das amerikanische Format (Monat/Tag/Jahr) annimmt. Für das europäische Datumsformat 01.02.2026 (Tag.Monat.Jahr) ist die Punktschreibweise eindeutig und wird korrekt erkannt. Im Zweifelsfall verwenden Sie DateTimeImmutable::createFromFormat(), um das genaue Format explizit festzulegen.

Die DateTime-Klasse

Seit PHP 5.2 steht die objektorientierte DateTime-Klasse zur Verfügung. Sie bietet gegenüber der prozeduralen Funktion date() erhebliche Vorteile: Zeitzonenunterstützung als fester Bestandteil des Objekts, einfache Datumsberechnungen und eine klarere Syntax für komplexere Anwendungsfälle.

Während date() und strtotime() rein prozedurale Funktionen sind, kapselt die DateTime-Klasse ein Datum samt Zeitzone in einem Objekt. Dadurch lässt sich das Datum als eigenständiger Wert durch die Anwendung reichen, ohne globale Einstellungen ändern zu müssen. Methoden wie add(), sub(), diff() und modify() machen Berechnungen deutlich lesbarer als die manuelle Arbeit mit UNIX-Timestamps.

Ein DateTime-Objekt erstellen

Ein DateTime-Objekt kann auf verschiedene Weisen erzeugt werden:

<?php
/* Aktuelles Datum und aktuelle Uhrzeit */
$jetzt = new DateTime();

/* Bestimmtes Datum angeben */
$datum = new DateTime('2026-06-15 14:30:00');

/* Mit Zeitzone erstellen */
$berlin = new DateTime('now', new DateTimeZone('Europe/Berlin'));
$tokyo  = new DateTime('now', new DateTimeZone('Asia/Tokyo'));

echo $berlin->format('H:i') . ' (Berlin)';
echo $tokyo->format('H:i') . ' (Tokyo)';
?>

Datum formatieren mit format()

Die Methode format() verwendet dieselben Formatzeichen wie die Funktion date():

<?php
$datum = new DateTime('2026-03-15 14:30:00');

echo $datum->format('d.m.Y');
/* Ausgabe: 15.03.2026 */

echo $datum->format('l, d. F Y');
/* Ausgabe: Sunday, 15. March 2026 */

echo $datum->format('H:i:s');
/* Ausgabe: 14:30:00 */

echo $datum->format(DateTime::ATOM);
/* Ausgabe: 2026-03-15T14:30:00+00:00 (ISO 8601) */
?>

Datum ändern mit modify()

Mit modify() können Sie ein bestehendes DateTime-Objekt verändern. Die Methode akzeptiert dieselben relativen Ausdrücke wie strtotime():

<?php
$datum = new DateTime('2026-01-15');

$datum->modify('+10 days');
echo $datum->format('d.m.Y');
/* Ausgabe: 25.01.2026 */

$datum->modify('-2 months');
echo $datum->format('d.m.Y');
/* Ausgabe: 25.11.2025 */

$datum->modify('next Friday');
echo $datum->format('d.m.Y');
/* Ausgabe: 28.11.2025 */
?>

Wichtig: Die Methode modify() verändert das bestehende Objekt sichekt. Das ursprüngliche Datum wird dabei überschrieben. Wenn Sie das Originaldatum behalten möchten, verwenden Sie DateTimeImmutable (siehe weiter unten).

DateInterval und Datumsberechnungen

Für präzise Datumsberechnungen bietet PHP die Klasse DateInterval. Mit ihr definieren Sie Zeitspannen, die Sie anschließend mit add() oder sub() auf ein DateTime-Objekt anwenden können. Intervalle werden im ISO-8601-Format angegeben, beginnend mit dem Buchstaben P (für „Period“). Diese Schreibweise mag zunächst ungewohnt wirken, ist aber international standardisiert und daher eindeutig:

<?php
$datum = new DateTime('2026-01-01');

/* 1 Jahr, 2 Monate und 10 Tage addieren */
$intervall = new DateInterval('P1Y2M10D');
$datum->add($intervall);
echo $datum->format('d.m.Y');
/* Ausgabe: 11.03.2027 */

/* 30 Tage subtrahieren */
$datum2 = new DateTime('2026-06-15');
$datum2->sub(new DateInterval('P30D'));
echo $datum2->format('d.m.Y');
/* Ausgabe: 16.05.2026 */
?>

Die gängigsten Intervall-Bezeichner sind: Y (Jahre), M (Monate), D (Tage), H (Stunden), I (Minuten) und S (Sekunden). Zeitangaben werden mit einem T eingeleitet, z. B. P1DT12H für 1 Tag und 12 Stunden.

Differenz zwischen zwei Daten berechnen

Die Methode diff() berechnet den Unterschied zwischen zwei DateTime-Objekten und gibt ein DateInterval zurück:

<?php
$start = new DateTime('2026-01-01');
$ende  = new DateTime('2026-12-31');

$differenz = $start->diff($ende);

echo $differenz->days . ' Tage';
/* Ausgabe: 364 Tage */

echo $differenz->format('%m Monate und %d Tage');
/* Ausgabe: 11 Monate und 30 Tage */
?>

Datum vergleichen

DateTime-Objekte können sichekt mit den Vergleichsoperatoren <, > und == verglichen werden:

<?php
$heute  = new DateTime();
$termin = new DateTime('2026-12-24');

if ($heute < $termin) {
    echo 'Der Termin liegt in der Zukunft.';
} elseif ($heute > $termin) {
    echo 'Der Termin ist bereits vergangen.';
} else {
    echo 'Der Termin ist heute.';
}
?>

DateTimeImmutable – die sichere Alternative

Die Klasse DateTimeImmutable (verfügbar seit PHP 5.5) funktioniert wie DateTime, mit einem entscheidenden Unterschied: Jede Änderung erzeugt ein neues Objekt, statt das bestehende zu verändern. Das verhindert unbeabsichtigte Seiten­effekte, insbesondere wenn Datumsobjekte an mehreren Stellen im Code verwendet oder an Funktionen übergeben werden. Dieses Verhalten ist vergleichbar mit Strings in PHP: Wenn Sie einen String ändern, entsteht ein neuer String, während der ursprüngliche erhalten bleibt.

<?php
/* DateTime: Originaldatum wird verändert */
$datum = new DateTime('2026-03-01');
$spaeter = $datum->modify('+7 days');

echo $datum->format('d.m.Y');
/* Ausgabe: 08.03.2026 (Original verändert!) */
echo $spaeter->format('d.m.Y');
/* Ausgabe: 08.03.2026 */

/* DateTimeImmutable: Originaldatum bleibt erhalten */
$datum2 = new DateTimeImmutable('2026-03-01');
$spaeter2 = $datum2->modify('+7 days');

echo $datum2->format('d.m.Y');
/* Ausgabe: 01.03.2026 (Original unverändert!) */
echo $spaeter2->format('d.m.Y');
/* Ausgabe: 08.03.2026 */
?>

In modernem PHP-Code wird empfohlen, standardmäßig DateTimeImmutable zu verwenden und nur dann auf DateTime zurückzugreifen, wenn das Objekt bewusst verändert werden soll.

Häufige Datumsformate im Überblick

Je nach Anwendungsfall werden unterschiedliche Datumsformate benötigt. Die folgende Tabelle zeigt die wichtigsten Formate und wie sie in PHP erzeugt werden:

Format Beispiel PHP-Code
Deutsches Datum 15.03.2026 date('d.m.Y')
Deutsch mit Uhrzeit 15.03.2026 14:30 date('d.m.Y H:i')
ISO 8601 2026-03-15T14:30:00+01:00 date('c') oder date(DATE_ATOM)
MySQL-Format 2026-03-15 14:30:00 date('Y-m-d H:i:s')
RFC 2822 Sun, 15 Mar 2026 14:30:00 +0100 date('r')
Nur Datum (sortierbar) 2026-03-15 date('Y-m-d')
Nur Uhrzeit 14:30:00 date('H:i:s')

Das ISO-8601-Format eignet sich besonders für APIs und den Datenaustausch, da es international eindeutig ist und die Zeitzone enthält. Für die Speicherung in MySQL-Datenbanken wird das Format Y-m-d H:i:s verwendet.

<?php
$datum = new DateTimeImmutable('2026-03-15 14:30:00',
    new DateTimeZone('Europe/Berlin'));

/* Verschiedene Formate ausgeben */
echo $datum->format('d.m.Y');         /* 15.03.2026 */
echo $datum->format('c');              /* 2026-03-15T14:30:00+01:00 */
echo $datum->format('Y-m-d H:i:s');   /* 2026-03-15 14:30:00 */
echo $datum->format('D, d M Y H:i');  /* Sun, 15 Mar 2026 14:30 */
?>

Datum aus einem String erstellen mit createFromFormat()

Wenn ein Datumsstring in einem bestimmten Format vorliegt, das PHP nicht automatisch erkennt, kann createFromFormat() verwendet werden. Diese Methode funktioniert sowohl mit DateTime als auch mit DateTimeImmutable:

<?php
/* Deutsches Datumsformat parsen */
$datum = DateTimeImmutable::createFromFormat(
    'd.m.Y',
    '15.03.2026'
);
echo $datum->format('Y-m-d');
/* Ausgabe: 2026-03-15 */

/* Datum mit Uhrzeit parsen */
$datum2 = DateTimeImmutable::createFromFormat(
    'd/m/Y H:i',
    '15/03/2026 14:30'
);
echo $datum2->format('d.m.Y \u\m H:i \U\h\r');
/* Ausgabe: 15.03.2026 um 14:30 Uhr */
?>

Hinweis: Bei einem ungültigen Eingabestring gibt createFromFormat() den Wert false zurück. Mit DateTime::getLastErrors() können Sie die genauen Fehler abfragen.

Vergleich: date() vs. DateTime-Klasse

Für einfache Ausgaben ist date() völlig ausreichend. Die DateTime-Klasse lohnt sich, sobald Sie Berechnungen durchführen, Zeitzonen verwalten oder Datumsobjekte in Ihrer Anwendung weitergeben möchten.

Kriterium date() DateTime / DateTimeImmutable
Einfache Formatierung Ideal Überdimensioniert
Datumsberechnungen Umständlich Einfach mit add/sub/modify
Zeitzonenunterstützung Global via date_default_timezone_set() Pro Objekt via DateTimeZone
Sicherheit (Immutability) Nicht verfügbar Ja, mit DateTimeImmutable
Vergleiche Über Timestamps Sichekt mit Operatoren

Datumsreihen erzeugen mit DatePeriod

Die Klasse DatePeriod ermöglicht es, über eine Reihe von Datumswerten zu iterieren. Das ist besonders nützlich, wenn Sie eine Folge von Tagen, Wochen oder Monaten durchlaufen möchten – etwa für einen Kalender, eine Terminplanung oder einen statistischen Bericht. Die Klasse benötigt ein Startdatum, ein Intervall und entweder ein Enddatum oder die Anzahl der Wiederholungen.

<?php
$start    = new DateTimeImmutable('2026-03-01');
$ende     = new DateTimeImmutable('2026-03-08');
$intervall = new DateInterval('P1D'); /* 1 Tag */

$zeitraum = new DatePeriod($start, $intervall, $ende);

foreach ($zeitraum as $tag) {
    echo $tag->format('D, d.m.Y');
}
/* Ausgabe: */
/* Sun, 01.03.2026 */
/* Mon, 02.03.2026 */
/* Tue, 03.03.2026 */
/* ... bis einschließlich Sat, 07.03.2026 */
?>

Das Enddatum ist standardmäßig nicht in der Reihe enthalten. Seit PHP 8.2 kann das mit der Option DatePeriod::INCLUDE_END_DATE geändert werden.

Ein weiteres Beispiel zeigt die monatliche Iteration:

<?php
$start = new DateTimeImmutable('2026-01-01');
$intervall = new DateInterval('P1M'); /* 1 Monat */

/* 12 Wiederholungen (ein ganzes Jahr) */
$zeitraum = new DatePeriod($start, $intervall, 11);

foreach ($zeitraum as $monat) {
    echo $monat->format('F Y');
}
/* Ausgabe: January 2026, February 2026, ... December 2026 */
?>

Tipps und häufige Fehlerquellen

Beim Arbeiten mit Datum und Zeit in PHP gibt es einige häufige Stolpersteine, die sich leicht vermeiden lassen:

  • Zeitzone immer setzen: Wenn keine Zeitzone explizit gesetzen ist, verwendet PHP die Einstellung aus php.ini. Setzen Sie date_default_timezone_set('Europe/Berlin') am Anfang Ihres Skripts oder übergeben Sie die Zeitzone sichekt an das DateTime-Objekt.
  • Monatsgrenzen beachten: Das Addieren von Monaten kann zu unerwarteten Ergebnissen führen. Wenn Sie zum 31. Januar einen Monat addieren, erhalten Sie den 3. März (da der 31. Februar nicht existiert). Für geschäftliche Anforderungen prüfen Sie das Ergebnis nach der Berechnung.
  • Sommer- und Winterzeit: Bei Berechnungen über Zeitumstellungen hinweg kann ein Tag 23 oder 25 Stunden haben. Verwenden Sie für tagesgenaue Berechnungen DateInterval('P1D') statt manuell 86.400 Sekunden zu addieren.
  • Timestamp-Überlauf: Auf 32-Bit-Systemen kann der UNIX-Timestamp ab dem Jahr 2038 überlaufen. Auf modernen 64-Bit-Systemen und mit der DateTime-Klasse besteht dieses Problem nicht.
  • Benutzereingaben validieren: Verwenden Sie createFromFormat() statt strtotime(), um Datumswerte aus Formularen zu parsen. So stellen Sie sicher, dass das erwartete Format eingehalten wird.

Carbon – komfortable Datumsbibliothek

Für umfangreichere Projekte, die häufig mit Datumsangaben arbeiten, gibt es die Bibliothek Carbon. Carbon erweitert die PHP-Klasse DateTimeImmutable und bietet zusätzliche Komfortfunktionen wie lesbare Differenzen („vor 3 Stunden“), Lokalisierung und vereinfachte Vergleichsmethoden.

Die Installation erfolgt über Composer:

composer require nesbot/carbon

Beispiel:

<?php
use Carbon\Carbon;

$jetzt = Carbon::now('Europe/Berlin');
echo $jetzt->format('d.m.Y H:i');

/* Relative Ausgabe */
echo Carbon::parse('2026-01-01')->diffForHumans();
/* z.B.: "vor 2 Monaten" */

/* Einfache Berechnungen */
$morgen = Carbon::tomorrow();
$naechsteWoche = $jetzt->addWeek();
?>

Carbon eignet sich besonders für Webanwendungen und Frameworks wie Laravel, in dem Carbon bereits standardmäßig enthalten ist. Für einfache Skripte reichen die nativen PHP-Klassen DateTime und DateTimeImmutable in der Regel vollkommen aus.

Zeitzonen mit DateTimeZone richtig setzen

Sobald Ihre Anwendung Nutzer aus mehreren Ländern bedient, kommen Sie um Zeitzonen nicht herum. Ein Server in Frankfurt, eine Datenbank in UTC und ein Besucher aus New York: drei verschiedene Realitäten für dieselbe Sekunde. PHP löst das über die Klasse DateTimeZone, die Sie jedem DateTime-Objekt mitgeben können.

Die saubere Strategie sieht so aus: In der Datenbank speichern Sie immer UTC. Bei der Ausgabe wandelst Sie in die Zeitzone des Nutzers um. So vermeiden Sie Doppeldeutigkeiten und sparen sich Ärger bei späteren Auswertungen.

<?php
declare(strict_types=1);

/* Zeitpunkt in UTC anlegen, wie er aus der DB kommt */
$utc = new DateTimeImmutable('2026-05-09 14:00:00', new DateTimeZone('UTC'));

/* Fuer die Anzeige in Berlin umrechnen */
$berlin = $utc->setTimezone(new DateTimeZone('Europe/Berlin'));
echo $berlin->format('d.m.Y H:i T'); /* 09.05.2026 16:00 CEST */

/* Gleicher Moment, andere Zone */
$ny = $utc->setTimezone(new DateTimeZone('America/New_York'));
echo $ny->format('d.m.Y H:i T'); /* 09.05.2026 10:00 EDT */
?>

DateTimeImmutable ist hier ein wichtiger Detailpunkt. Im Gegensatz zu DateTime wird das Original-Objekt nicht verändert. setTimezone() liefert ein neues Objekt zurück, das Sie gefahrlos weiterreichen können.

Liste aller verfügbaren Zeitzonen

Wenn Sie dem Nutzer eine Auswahl anbieten wollen, holen Sie sich die Identifier über DateTimeZone::listIdentifiers(). Sie folgen dem IANA-Standard und sind die einzige verlässliche Quelle. Verwenden Sie niemals Abkürzungen wie "MEZ" oder "CEST" als Eingabe, da sie mehrdeutig sind.

<?php
$zonen = DateTimeZone::listIdentifiers(DateTimeZone::EUROPE);
foreach ($zonen as $zone) {
    echo $zone . "
"; /* Europe/Berlin, Europe/London, ... */
}
?>

date_default_timezone_set vs php.ini

Viele Entwickler kennen den Klassiker: ein Skript läuft lokal perfekt, auf dem Live-Server zeigt es plotzlich Zeiten in UTC oder, schlimmer, eine Warnung über eine fehlende Zeitzone. Der Grund liegt fast immer in einer abweichenden Konfiguration zwischen Entwicklungs- und Produktionsumgebung.

PHP zieht die Zeitzone in dieser Reihenfolge: zuerst der Wert aus date_default_timezone_set(), falls im Skript gesetzen. Dann der Wert date.timezone aus der php.ini. Wenn beides fehlt, fällt PHP auf UTC zurück und gibt ab Version 8 keine Warnung mehr aus, was früher noch der Fall war.

<?php
/* Variante 1: zur Laufzeit setzen, Vorrang vor php.ini */
date_default_timezone_set('Europe/Berlin');

/* Variante 2: aktuell aktive Zeitzone abfragen */
echo date_default_timezone_get(); /* Europe/Berlin */

/* Variante 3: Wert aus der php.ini lesen */
echo ini_get('date.timezone');
?>

Mein Rat: setze die Zeitzone in einer zentralen Bootstrap-Datei Ihres Projekts. So müssen Sie sich nie auf die Server-Konfiguration verlassen und das Verhalten ist auf jedem Hosting identisch. Wer sich genauer mit Konfigurationsfragen beschäftigen will, findet im Tutorial zu ini_set weiterführende Hinweise.

ISO-Wochen und Kalenderwochen sauber berechnen

Kalenderwochen sehen einfach aus, sind aber eine berüchtigte Stolperfalle. Deutschland nutzen den ISO-8601-Standard: die Woche beginnt am Montag, und die erste Woche eines Jahres ist diejenige, die mindestens vier Tage im neuen Jahr enthält. Das führt dazu, dass der 1. Januar 2027 noch zur Woche 53 von 2026 gehoeren kann.

Für die Berechnung gibt es zwei wichtige Formatzeichen: W liefert die ISO-Wochennummer, o das ISO-Wochenjahr. Verwenden Sie niemals Y zusammen mit W, sonst bekommen Sie am Jahreswechsel falsche Ergebnisse.

<?php
declare(strict_types=1);

$datum = new DateTimeImmutable('2027-01-01');

echo $datum->format('W');     /* 53 */
echo $datum->format('o-W');   /* 2026-53, korrekt */
echo $datum->format('Y-W');   /* 2027-53, falsch! */
?>

Start- und Enddatum einer Woche

Wer einen Wochenkalender oder Schichtplan baut, braucht oft den Montag und Sonntag einer KW. Mit der relativen Syntax von strtotime, hier über das DateTime-Pendant modify, geht das in zwei Zeilen.

<?php
function wochenrange(int $jahr, int $kw): array
{
    $montag = (new DateTimeImmutable())
        ->setISODate($jahr, $kw)
        ->setTime(0, 0);
    $sonntag = $montag->modify('+6 days');

    return [$montag, $sonntag];
}

[$start, $ende] = wochenrange(2026, 19);
echo $start->format('d.m.Y') . ' bis ' . $ende->format('d.m.Y');
?>

Schaltjahre zuverlässig erkennen

Ein Schaltjahr ist nicht einfach "alle vier Jahre". Die genaue Regel: durch 4 teilbar, aber nicht durch 100, es sei denn auch durch 400. Das Jahr 2000 war ein Schaltjahr, 1900 nicht, 2100 wird wieder keines sein. Sie müssen das glücklicherweise nie selbst rechnen, denn date() bringt das Formatzeichen L mit.

<?php
declare(strict_types=1);

function istSchaltjahr(int $jahr): bool
{
    /* L liefert 1 fuer Schaltjahr, 0 sonst */
    return (bool) date('L', mktime(0, 0, 0, 1, 1, $jahr));
}

var_dump(istSchaltjahr(2024)); /* true */
var_dump(istSchaltjahr(2026)); /* false */
var_dump(istSchaltjahr(2100)); /* false */
?>

Eleganter geht es objektorientiert über DateTime, da brauchen Sie mktime nicht und sparen sich den Timestamp-Umweg.

<?php
$jahr = 2024;
$check = new DateTimeImmutable("$jahr-01-01");
echo $check->format('L') === '1' ? 'Schaltjahr' : 'Normales Jahr';
?>

Alter berechnen und Geburtstags-Reminder

Eine der häufigsten Praxisaufgaben: aus einem Geburtsdatum das aktuelle Alter ableiten. Klingt nach einer simplen Subtraktion, aber wer einfach Jahre voneinander abzieht, liegt am Jahresanfang fast immer um eins daneben. Sauberer geht es mit diff(), das eine DateInterval-Instanz liefert.

<?php
declare(strict_types=1);

function alterInJahren(string $geburtsdatum): int
{
    $geburt = new DateTimeImmutable($geburtsdatum);
    $heute  = new DateTimeImmutable('today');

    return $geburt->diff($heute)->y;
}

echo alterInJahren('1990-08-15'); /* 35, je nach heutigem Datum */
?>

Wer hat in den nächsten 7 Tagen Geburtstag?

Für ein Mitgliedersystem oder einen Newsletter wollen Sie oft alle anstehenden Geburtstage finden. Trick: vergleiche nur Tag und Monat, nicht das Jahr. Mit dem Format m-d ist der Vergleich als String absolut zuverlässig.

<?php
$mitglieder = [
    ['name' => 'Anna', 'geburt' => '1992-05-12'],
    ['name' => 'Ben',  'geburt' => '1988-05-15'],
    ['name' => 'Clara','geburt' => '1995-12-01'],
];

$heute   = new DateTimeImmutable('today');
$inEiner = $heute->modify('+7 days');

foreach ($mitglieder as $m) {
    $tag = substr($m['geburt'], 5);    /* m-d */
    if ($tag >= $heute->format('m-d')
        && $tag <= $inEiner->format('m-d')) {
        echo $m['name'] . ' hat bald Geburtstag!' . PHP_EOL;
    }
}
?>

Lifecycle einer DateTime-Operation

Damit Sie den Ablauf einer typischen Datumsverarbeitung in Ihrer Anwendung vor Augen hast, hier eine kompakte Visualisierung. Der Pfad reicht von der Roh-Eingabe bis zur Ausgabe an den Nutzer und zeigt, an welchen Stellen die Zeitzone eine Rolle spielt.

flowchart TD
    A[User Input oder DB] --> B[parse mit DateTimeImmutable]
    B --> C[Validierung]
    C --> D[Zeitzone setzen]
    D --> E[format Ausgabe]

Wichtig ist, dass jeder Pfeil eine bewusste Entscheidung darstellt. Beim Parsen entscheiden Sie, in welcher Zeitzone der Eingabewert gemeint ist. Beim Formatieren entscheiden Sie, in welcher Zeitzone der Nutzer das Ergebnis sehen soll. Wer diese beiden Schritte trennt, vermeidet die berüchtigten "eine Stunde daneben"-Bugs.

Sommerzeit und Winterzeit als Bug-Quelle

Zweimal im Jahr passiert in Mitteleuropa etwas, das Datumsbibliotheken weltweit eine Welle von Issue-Tickets beschert: die Zeitumstellung. In der Nacht zum letzten Sonntag im März wird eine Stunde übersprungen, im Oktober eine doppelt durchlaufen. Wenn Sie das ignorierst, läuft Ihr Schichtplan irgendwann gegen die Wand.

Ein klassisches Beispiel: Sie addierst 24 Stunden auf einen Zeitstempel und erwartest dadurch den nächsten Tag zur gleichen Uhrzeit. Genau das stimmt aber nicht, wenn dazwischen die Umstellung liegt.

<?php
declare(strict_types=1);

$tz   = new DateTimeZone('Europe/Berlin');
$start = new DateTimeImmutable('2026-03-28 12:00:00', $tz);

/* Falsch: 24 Stunden addieren */
$plus24h = $start->modify('+24 hours');
echo $plus24h->format('d.m.Y H:i'); /* 29.03.2026 13:00 */

/* Richtig: einen ganzen Tag addieren */
$plus1Tag = $start->modify('+1 day');
echo $plus1Tag->format('d.m.Y H:i'); /* 29.03.2026 12:00 */
?>

Die Faustregel lautet: für Kalenderoperationen wie "morgen, nächste Woche, in einem Monat" arbeiten Sie mit Tag-, Wochen- oder Monatsangaben. Für physikalische Zeitspannen wie "in genau 3600 Sekunden" arbeiten Sie mit Sekunden oder UTC. Wenn Sie sich an diese Trennung hältst, sind Sommerzeitprobleme erledigt, bevor sie auftauchen.

Fluent-Interface mit DateTimeImmutable

Eine der angenehmsten Eigenschaften von DateTimeImmutable ist die flüssige Verkettung von Methoden. Da jede Methode ein neues Objekt zurückgibt, können Sie Berechnungen lesbar in einer Zeile zusammenstellen. Vergleichbares gibt es bei Closures und in modernen Arrow Functions.

<?php
declare(strict_types=1);

/* Letzter Werktag des aktuellen Monats um 17:00 */
$deadline = (new DateTimeImmutable('first day of next month'))
    ->modify('-1 day')
    ->modify('previous weekday')
    ->setTime(17, 0);

echo $deadline->format('l, d.m.Y H:i');

/* Gleicher Wochentag in vier Wochen, 9 Uhr */
$termin = (new DateTimeImmutable('next monday'))
    ->modify('+4 weeks')
    ->setTime(9, 0);

echo $termin->format('d.m.Y H:i');
?>

Setzen Sie diese Schreibweise gezielt ein und nicht inflationär. Drei bis vier Methoden in einer Kette sind übersichtlich, danach leidet die Lesbarkeit. Bei mehr Schritten bricht Sie in Teilvariablen mit sprechenden Namen auf, dann lesen sich der Code wie deutsche Prosa und ein Kollege im Code-Review versteht ihn ohne Rückfrage.

Praxisbeispiele

Die folgenden Beispiele zeigen typische Aufgaben, die in Webprojekten häufig vorkommen.

Alter aus dem Geburtsdatum berechnen

<?php
$geburtstag = new DateTimeImmutable('1990-07-25');
$heute      = new DateTimeImmutable();

$alter = $geburtstag->diff($heute);
echo 'Alter: ' . $alter->y . ' Jahre';
/* z.B.: Alter: 35 Jahre */
?>

Die Eigenschaft y des DateInterval-Objekts liefert die Anzahl vollständiger Jahre. Damit lässt sich das Alter zuverlässig ermitteln, unabhängig von Schaltjahren.

Countdown bis zu einem Ereignis

<?php
$silvester = new DateTimeImmutable('2026-12-31 23:59:59');
$jetzt     = new DateTimeImmutable();

$rest = $jetzt->diff($silvester);

echo 'Noch ' . $rest->m . ' Monate und '
    . $rest->d . ' Tage bis Silvester.';
/* z.B.: Noch 10 Monate und 14 Tage bis Silvester. */
?>

Alle Montage eines Monats ermitteln

<?php
$start = new DateTimeImmutable('first Monday of March 2026');
$ende  = new DateTimeImmutable('last day of March 2026');

$woche = new DateInterval('P7D');
$zeitraum = new DatePeriod($start, $woche, $ende);

foreach ($zeitraum as $montag) {
    echo $montag->format('d.m.Y (l)');
}
/* Ausgabe: */
/* 02.03.2026 (Monday) */
/* 09.03.2026 (Monday) */
/* 16.03.2026 (Monday) */
/* 23.03.2026 (Monday) */
/* 30.03.2026 (Monday) */
?>

Dieses Muster lässt sich beliebig anpassen – etwa um alle Freitage oder den ersten Mittwoch jedes Monats zu finden. Die Kombination aus DatePeriod und relativen Datumsausdrücken macht solche Aufgaben besonders elegant.

Datum für eine MySQL-Datenbank vorbereiten

<?php
/* Eingabe aus einem HTML-Formular (deutsches Format) */
$eingabe = '15.03.2026';

$datum = DateTimeImmutable::createFromFormat(
    'd.m.Y',
    $eingabe,
    new DateTimeZone('Europe/Berlin')
);

if ($datum !== false) {
    /* In UTC umwandeln und als MySQL-Format ausgeben */
    $utc = $datum->setTimezone(new DateTimeZone('UTC'));
    echo $utc->format('Y-m-d H:i:s');
    /* Ausgabe: 2026-03-14 23:00:00 */
} else {
    echo 'Ungültiges Datum.';
}
?>

Dieser Ablauf – Eingabe parsen, in UTC umwandeln und im MySQL-Format speichern – ist ein bewährtes Muster für internationale Webanwendungen. Bei der Ausgabe an den Nutzer wird der Vorgang umgekehrt: UTC aus der Datenbank lesen und in die lokale Zeitzone umrechnen.

Zusammenfassung

PHP bietet ein breites Spektrum an Werkzeugen für die Arbeit mit Datum und Zeit. Für einfache Formatierungsaufgaben genügt die prozedurale Funktion date() in Kombination mit time() und strtotime(). Sobald Berechnungen, Zeitzonenkonvertierungen oder Vergleiche erforderlich sind, sollten Sie auf die objektorientierte DateTime-Klasse zurückgreifen.

Für neuen Code empfiehlt sich DateTimeImmutable als Standard, da sie unbeabsichtigte Änderungen an bestehenden Datumsobjekten verhindert. Mit DateInterval lassen sich Zeiträume präzise definieren, und DatePeriod ermöglicht die Iteration über Datumsreihen. Für den deutschsprachigen Raum ist es wichtig, die Zeitzone Europe/Berlin zu setzen und für lokalisierte Monatsnamen den IntlDateFormatter zu verwenden.

Internationale Anwendungen profitieren davon, Datumswerte intern in UTC zu speichern und erst bei der Ausgabe in die lokale Zeitzone umzurechnen. Wer darüber hinaus Komfortfunktionen wie lesbare Zeitdifferenzen oder erweiterte Lokalisierung benötigt, findet in der Bibliothek Carbon eine bewährte Ergänzung.




weiter zum nächsten Kapitel: Ausnahmebehandlung in Php