PHP – Teil 13: DateTime

Im letzten Artikel der Serie haben wir uns Timestamps näher angesehen. Das Arbeiten mit Daten und Zeiten kommt in der PHP Programmierung häufig vor. Wann wurde ein Artikel geschrieben? Ist der Besucher alt genug um bestimmte Inhalte sehen zu dürfen? Zu welchem Zeitpunkt soll ein Post freigeschalten werden?

Timestamps funktionieren zwar relativ simpel, werden bei komplexeren Aufgaben aber dann sehr schnell umständlich. Für diese Fälle bietet PHP uns inzwischen die DateTime Klasse. Diese unterstützt uns mit vielfältigen Funktionen in diesem Bereich und ist dabei einfach zu benutzen.

Die DateTime Klasse

Wer sich mit Klassen überfordert fühlt sollte sich meine Tutorialreihe zum Thema OOP in PHP anschauen. Grundsätzliches Wissen über die Objektorientierung wird in diesem Artikel vorausgesetzt.

Die DateTime Klasse ist ein mächtiges Tool für die Berechnung verschiedenster Dinge die mit Daten und Zeiten zu tun haben. Da die komplette Funktionalität den Rahmen hier sprengen würde schauen wir uns hier erstmal die grundsätzlichen Möglichkeiten an. Für weitere Infos gibt es schließlich php.net.

Ein DateTime Objekt erzeugen

Zuerst müssen wir natürlich ein Datumsobjekt erzeugen. Dafür können wir dem Konstruktor der DateTime Klasse zwei Parameter übergeben:

  • Einen Zeitstring (dieser versteht dieselben Möglichkeiten wie die strtotime() Funktion)
  • Eine Zeitzone (falls wir Berechnungen zwischen verschiedenen Zeitzonen anstellen wollen)

Lassen wir die Parameter weg geht PHP automatisch von der aktuell auf dem Server eingestellten Zeit und Zeitzone aus.
Damit haben wir eine Objektrepräsentation einer Zeit. Mit diesem Objekt können wir nun weiterarbeiten.

Doch was ist, wenn nun das Datum in einem anderen Format verlangt wird? Wenn wir zum Beispiel in der Datenbank einen Timestamp abspeichern oder dem Besucher vielleicht das Datum in einer lesbaren Form ausgeben möchten?

 

Ein DateTime Objekt formatieren

Für diesen Fall haben wir mehrere Methoden in unserem Objekt zur Verfügung.

Wie wir im Beispiel sehen ist es ganz einfach, mit DateTime Objekten zu arbeiten. Zuerst erzeugen wir unser Objekt, dann geben wir es formatiert aus. Die format() Methode nimmt dabei dieselben Formatierungen entgegen wie die altbekannte date() Funktion.
Damit können wir für eine leserliche Ausgabe sorgen oder auch für das richtige Format, wenn wir den Wert zum Beispiel in einer Datenbank speichern möchten.

Genau für diesen Fall ist auch noch die Methode getTimestamp() interessant, die uns einfach den UNIX Timestamp des Objekts zurückgibt.

 

Zeiträume mit der DateTime Klasse

Oft kommt es vor, dass wir gewisse Zeiträume berechnen wollen, die zwischen zwei Daten liegen. Wieviele Nächte für einen Hotelbesucher liegen zwischen Anreise und Abreise? Wieviele Tage dauert es noch bis zum Event X? Wie alt ist jemand, der an Tag Y geboren ist?
Das wird uns durch die DateInterval Klasse erleichtert. Ein Objekt dieser Klasse stellt einen gewissen Zeitraum in Jahren, Monaten, Tagen etc dar. PHP bietet uns verschiedene Möglichkeiten, dieses Objekt zu erzeugen.

DateInterval zwischen zwei DateTime Objekten

Die DateTime Klasse bietet eine Methode namens diff(). Diese nimmt als Parameter ein weiteres DateTime Objekt und gibt dann die Differenz zwischen diesen beiden Zeitpunkten in Form eines DateInterval Objekt zurück.

Dieses Beispiel berechnet mir ein DateInterval zwischen dem heutigen Tag und meinem Geburtstag. Das $diff Objekt enthält also später die genaue Anzahl an Jahren, Monaten, Tagen, Stunden, Minuten und Sekunden wie alt ich bin (natürlich nur wenn ich auch den genauen Zeitpunkt meiner Geburt angebe ;-)). Dafür stellt die DateInterval Klasse folgende Attribute bereit:

  • y – Jahre
  • m – Monate
  • d – Tage
  • h – Stunden
  • i – Minuten
  • s – Sekunden
  • days – Falls das Objekt mit oben gezeigter diff() Methode erzeugt wurde enthält diese Variable die Gesamtzahl an Tagen zwischen den beiden Daten, andernfalls ist ihr Wert false.

 

Ein DateInterval neu erzeugen

Um ein DateInterval allein zu erzeugen (beispielsweise um einem DateTime Objekt ein gewisses Interval dazuzurechnen oder abzuziehen) gibt es zwei Möglichkeiten:

  1. Den Konstruktor des DateIntervals
  2. Die statische Methode createFromDateString() der DateInterval Klasse

Der Konstruktor nimmt dabei einen String der nach einer etwas seltsamen Methode aufgebaut ist. Dieser beginnt mit einem großen P (für „Period“) und enthält danach die einzelnen Elemente jeweils durch ihren Buchstaben abgetrennt. Sollte dabei noch eine Zeit vorkommen wird diese vom Rest noch mit einem großen T abgetrennt. Dieses T ist auch wichtig, wenn es davor gar keine Einheiten gibt, denn es macht dem PHP Interpreter verständlich, dass ein M danach Minuten – nicht Monate – bedeutet.

 

  • Y – Jahre
  • M – Monate
  • D – Tage (nur falls es keine Wochen gibt)
  • W – Wochen (diese werden automatisch in Tage umgewandelt, können also nicht zusammen mit D vorkommen)
  • H – Stunden
  • M – Minuten (wenn sich das M hinter dem T befindet)
  • S – Sekunden

An sich nicht kompliziert aber eben doch sehr ungewohnt, dieses Format. Um das zu vereinfachen gibt es allerdings auch die createFromDateString() Methode, die dasselbe Stringformat wie zum Beispiel strtotime() nimmt. Sehen wir uns ein Beispiel an:

Das sieht doch schon viel lesbarer aus. Wir müssen hier auf den doppelten Doppelpunkt zwischen Klassennamen und Methodennamen achten, der eine statische Methode kennzeichnet.

Da wir nun wissen, wie wir ein DateInterval Objekt erzeugen, können wir dieses auch verwenden um DateTime Objekte zu manipulieren.

 

Einen Zeitraum zu einem DateTime Objekt dazurechnen

Möchten wir zum Beispiel den Zeitpunkt in genau zwei Wochen oder vor drei Monaten und zwölf Tagen wissen bietet uns die DateTime Klasse die Methoden add() und sub() (für subtract) an. Diese nehmen jeweils ein DateInterval Objekt und verändern das DateTime Objekt um das angegeben Interval.

Gar nicht so schwer oder? Damit haben wir nun die Mittel, komfortabel Zeiten, Daten und Zeiträume zu berechnen.

Fragen könnt Ihr natürlich jederzeit in den Kommentaren stellen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*