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();Um das Ganze etwas leserfreundlicher zu machen, können wir auch Folgendes schreiben:
$dateTime = new DateTime('now');Als nächstes haben wir z.B. ein Datum in einem bestimmten Format gegeben:
$dateTime = new DateTime('2013-03-11');Wie zu erkennen ist, könnt ihr den String direkt dem Konstruktor übergeben.
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');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');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');
}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 />';
} 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.
- 13. März 2013
ursprüngliche Veröffentlichung in meinem ehemaligen Blog "Smart-Webentwicklung"