PHP: DateTime, DateInterval & DatePeriod verwenden

Für PHP gibt es viele hilfreiche Funktionen zum Arbeiten mit Datums- & Uhrzeitangaben. Bekannte Vertreter sind hier z.B. die Funktionen date und strtotime.

Seit Einzug der objektorientierten Programmierung in PHP gibt es hierfür aber auch spezielle Klassen, die einem die Arbeit mit Zeitangaben enorm erleichtern.

In diesem Beitrag erfahrt ihr die grundlegende Verwendung der DateTime-Klasse.

DateTime-Objekt erzeugen

Beim Erzeugen eines DateTime-Objekts können wir dem Konstruktor der Klasse ein Datum als String übergeben. Möchten wir z.B. ein Objekt haben, welches das aktuelle Datum repräsentiert, dann reicht folgende Instanziierung:

$dateTime = new DateTime();
PHP

Um das Ganze etwas leserfreundlicher zu machen, können wir auch Folgendes schreiben:

$dateTime = new DateTime('now');
PHP

Als nächstes haben wir z.B. ein Datum in einem bestimmten Format gegeben:

$dateTime = new DateTime('2013-03-11');
PHP

Wie zu erkennen ist, könnt ihr den String direkt dem Konstruktor übergeben.

Tipp Liste unterstützter Formatangaben

Alle möglichen Formate, die ihr dem DateTime-Konstruktor übergeben könnt, findet ihr in der PHP-Dokumentation: Supported Date and Time Formats

Formatierte Datums- bzw. Zeitangabe

Das Datum bzw. die Zeit, die ein DateTime-Objekt repräsentiert, kann mittels format in einen formatierten String ausgegeben werden:

$dateTime = new DateTime('2013-03-11');

// Ausgabe: '11.03.2013'
echo $dateTime->format('d.m.Y');

// Ausgabe: '31' (Anzahl der Tage des Monats)
echo $dateTime->format('t');
PHP

DateTime modifizieren

Im Moment arbeite ich gerade an einer Applikation die eine Art Kalender-Feature beinhaltet. Dabei benötige ich des Öfteren basierend auf einem bestimmten Datum ein Datum, dass z.B. 7 Tage oder 1 Jahr in der Zukunft liegt.

Auch solche Anwendungsfälle lassen sich mit der DateTime-Klasse unkompliziert erledigen:

$dateTime = new DateTime('2013-03-11');

// $dateTime repräsentiert nun den 18. März 2013
echo $dateTime->modify('+7 days');

// $dateTime repräsentiert nun den 18. März 2014
echo $dateTime->format('+12 months');
PHP

Zeitraum zwischen zwei Datumsangaben ermitteln

Was ich weiterhin benötigte war, dass ich den Zeitraum zwischen einem gegebenen Start- und Enddatum brauchte. Ich wollte also über den Zeitraum iterieren, also eine Schleife laufen lassen.

Wie immer führen mehrere Wege zum Ziel und mein erster Gedanke war Folgender:

$startDateTime = new DateTime('2013-03-01');
$endDateTime = new DateTime('2013-03-31');

$tmpDateTime = new DateTime();
$tmpDateTime->setDate(
    $startDateTime->format('Y'),
    $startDateTime->format('m'),
    $startDateTime->format('d'),
);

while($tmpDateTime <= $endDateTime)
{
    // mach irgendwas mit $tmpDateTime

    $tmpDateTime->modify('+1 day');
}
PHP

DateInterval & DatePeriod verwenden

Nach einem Blick in die PHP-Dokumentation sind mir dann aber die Klassen DateInterval und DatePeriod aufgefallen.

Damit sieht die Lösung dann, wie ich finde, etwas eleganter aus:

$startDateTime = new DateTime('2013-03-01');
$endDateTime = new DateTime('2013-03-31');
$dateInterval = new DateInterval('P1D');
$datePeriod = new DatePeriod($startDateTime, $dateInterval ,$endDateTime);

foreach($datePeriod as $dateTime)
{
    echo $dateTime->format('d.m.Y') . '<br />';
}
PHP

Das DateInterval haben wir in unserem Fall auf einen 1 Tag gesetzt. Das Intervall als auch Start- und Enddatum können wir anschließend dem Konstruktor der DatePeriod-Klasse übergeben.

Danach können wir mittels foreach den Zeitraum "durchwandern".

Fazit

Die DateTime-Klasse unterstützt einen bei Arbeiten mit Datums- & Zeitangaben und bietet einige nützliche Methoden.

Gerade für diejenigen, die objektorientiert programmieren sind die vorgestellten Klassen eine gute Alternative zu den prozeduralen Datums- & Zeit-Funktionen von PHP.

Ich selbst nutze in meinen PHP-Projekten eigentlich nur noch die genannten Klassen und verzichte auf den Einsatz von date und Co.

Aktualisierungshistorie:
  • 13. März 2013
    ursprüngliche Veröffentlichung in meinem ehemaligen Blog "Smart-Webentwicklung"
Feedback

Für Feedback zum Beitrag, seien es Fragen, Korrigierungen und/oder Anregungen, könnt ihr mir gerne eine Nachricht per E-Mail oder Mastodon schreiben (siehe Kontakt).