Heute ist mir in einem Projekt eines Kunden aufgefallen, dass der Umgang mit Datumsformaten oftmals noch mit den prozeduralen PHP Funktionen erledigt wird. Daran ist nichts auszusetzen, da diese prozeduralen PHP Funktionen nach wie vor ihren Job erledigen. Dennoch hat mich interessiert, inwieweit sich diese prozeduralen Funktionen vom PHP DateTime Objekt unterscheiden und welche Vorteile das DateTime Objekt eigentlich bietet.
Hierzu mal folgendes prozedurales Beispiel:
$timestamp = strtotime('01.01.2013');
$date = date('Y-m-d', $timestamp);
echo $date; // 2013-01-01
Mit der strtotime() Funktion erzeugen wir einen UNIX Timestamp, aus dem wir dann mit der Funktion date() ein Datumsformat erzeugen. Funktioniert wunderbar und ziemlich schnell.
Jetzt das Beispiel auf Basis des DateTime Objektes:
$timezone = new DateTimeZone('Europe/Berlin');
$date = DateTime::createFromFormat('d.m.Y', '01.01.2013', $timezone);
echo $date->format('Y-m-d'); // 2013-01-01
In diesem Beispiel wird ein DateTime Objekt erzeugt, welches anhand eines übergebenes Formates eine Ausgabe in einem anderen festgelegten Format erzeugt. Wir erzielen hier also das gleiche Ergebnis wie mit den prozeduralen Funktionen.
Warum also das DateTime Objekt benutzen?
Aus dem objektorientierten Kontext heraus macht es natürlich Sinn das DateTime Objekt zu benutzen, da die Benutzung sehr viel lesbarer ist und eine sehr viel bessere Basis für die Erweiterung darstellt. Aber welche Vorteile bietet dieses Objekt noch? Richtig, ihr wollt wahrscheinlich wissen, ob die Performance stimmt. Ich habe unter PHP 5.4.7 auf meinem lokalen System beide oben dargestellten Varianten jeweils 10.000 mal durchlaufen lassen. Zu meiner Überraschung durclief die DateTime Variante die Schleife im Schnitt immer 0.1 Sekunden schneller, wie die prozedurale Variante. Ich bin eher vom Gegenteil ausgegangen. Zudem liefert das DateTime Objekt im Fehlerfall Exceptions, die man weiterverarbeiten kann.
Habt ihr schon mal versucht zwei Daten zu vergleichen? Hier mal zwei Beispiele, wie dies aussehen könnte:
$timestamp1 = strtotime('01.01.2013');
$timestamp2 = strtotime('19.12.2012');
if ($timestamp1 > $timestamp 2) {
echo date('Y-m-d', $timestamp1) . " ist größer als " . date('Y-m-d', $timestamp2) . "\n";
}
Mit dem DateTime Objekt funktioniert es ähnlich einfach:
$datetime1 = DateTime::createFromFormat('d.m.Y', '01.01.2013');
$datetime2 = DateTime::createFromFormat('d.m.Y', '19.12.2013');
if ($datetime1 > $datetime2) {
echo $datetime1->format('Y-m-d') . " ist größer als " . $datetime1->format('Y-m-d') . "\n";
}
Der Unterschied zwischen beiden Varianten ist einmal die Zeit, die beide zur Ausführung benötigen. Unter PHP 5.4.7 ist die DateTime Variante minimal schneller. Das war aber nach den ersten Tests auch schon abzusehen. Schön hierbei ist, dass bei der DateTime Variante zwei Objekte und nicht wie bei der prozeduralen Variante zwei UNIX Timestamps miteinander verglichen werden.
Fazit?
Im Grunde genommen ziehe ich meine Schlüsse natürlich aus dem Geschwindigkeitsvorteil, der sich vor allem in größeren Projekten enorm auswirken kann. Weiterhin arbeite ich in den meisten Projekten ausschließlich objektorientiert. Somit schließe ich persönlich die Nutzung der prozeduralen Funktionen weitestgehend aus. Das soll jetzt aber nicht heißen, dass sie schlecht sind.
Wie arbeitet ihr um Umgang mit Datumsformaten? Welche Vorgehensweise bevorzugt ihr?
1 Gedanke zu „Datumsangaben mit PHP“