[Tipp] PHP 5 und Datum Handling

  • Hallo Dynamiker,


    sehr häufig hat man es in PHP mit Ausgaben, Berechnungen und Vergleichen von Datum-Werten zu tun. Das kann mitunter schon recht tricky sein und selbst so eine simple Sache wie ein Datum im amerikanischen Format (wie es z.B. MySQL benutzt) in ein deutsches Format umwandeln lässt einem graue Haare wachsen.


    Seit Version 5 bringt PHP eine relativ komfortable Klasse mit sich, die einem zumindest einfache Dinge im Umgang mit Datum erleichtern. Die Klasse in PHP 5 nennt sich DateTime und ich möchte Euch hier mal 2 einfache Anwendungsbeispiele zeigen.


    Amerikanisches Datum in deutsches Datum umwandeln.

    PHP
    1. $datum = new DateTime( "2007-08-11 14:32:18", new DateTimeZone( 'CET' ) );
    2. echo $datum->format( "d.m.Y H:i:s" ); // Gibt aus: 11.08.2007 14:32:18
    3. echo $datum->format( "d.m.Y" ); // Gibt aus: 11.08.2007


    Der erste Parameter ist Pflicht und es wird ein Datum erwartet. Das muß nicht zwangsläufig in diesem Format vorliegen, dazu aber gleich mehr. Der 2. Parameter ist optional und legt fest welcher Zeitzone das Datum angehört. Hier kann man pauschal "CET" angeben um das Datum der Central European Time zuzuordnen. Ebenso könnte man auch explizit eine deutsche Zeitzone angeben, z.B. "Europe/Berlin" oder amerikanisch "America/New_York". Die Zeitzone ist etwa wichtig um Zeitumstellungen oder Zeitverschiebungen bei Berechnungen zu berücksichtigen. Lässt man den 2. Parameter leer, wird versucht die Zeitzone vom Server auszulesen. Das wird in den meisten Fällen ausreichend sein, sofern man nicht vorhat "globale" Berechnungen durchzuführen.
    Wie hier zu sehen ist geben wir ein Datum an, wie es z.B. von einem DateTime Feld in einer MySQL DB kommen könnte.
    In Zeile 2 geben wir das Datum durch die Methode format() in der gewünschten (deutschen) Formatierung aus.



    Was erwartet DateTime?
    Wenn man ein neues DateTime Objekt erzeugt, wird ein Parameter erwartet der identisch mit der Funktion [phpfunction]strtotime[/phpfunction] ist. Man gibt also das Datum als String an, wobei man hier mehr oder weniger freie Hand hat. Um das Rad nicht neu erfinden zu müssen, schaut Ihr am besten bei der entsprechenden Funktion die Beispiele an um zu verstehen wie man diese Datumsangabe benutzt.



    Zwei Termine vergleichen


    Wir erzeugen ein neues DateTime Objekt ($datum_start) mit dem Datum von Heute. Dieses Objekt klonen wir ($datum_ende) und benutzen die Methode modify() um dem geklonten Objekt 7 Tage dazu zu addieren. Würden wir z.B. 7 Tage abziehen wollen, gibt man z.B. "7 days ago" an.
    Anschliessend vergleichen wir die 2 Termine in der IF-Anweisung, indem wir das Datum mithilfe des Schalter "U" in einen Timestamp umwandeln.
    So lässt sich sehr einfach errechnen, ob ein gewisses Datum z.B. im Bereich einer Woche liegt.


    Weiterführende Informationen zu den neuen Funktionen findet Ihr wie üblich in der Dokumentation: DateTime

  • Gut zu wissen, aber - dein Link zeigt nur alle normalen Funktionen und nichts zu der DateTime Klasse? Oder bin ich nur gerade blind? :D

    My software never has bugs. It just develops random features ... :D
    [FONT="System"]
    » DevShack - die Website des freien Webentwicklers Boris ;)

  • Gut zu wissen, aber - dein Link zeigt nur alle normalen Funktionen und nichts zu der DateTime Klasse? Oder bin ich nur gerade blind? :D


    Hallo Boris,


    Du musst auf die einzelnen Funktionen klicken, wie etwa date_create. Ist dort ein OOP Zugriff möglich, zeigt es das in Form von

    Zitat

    DateTime DateTime::__construct ([ string $time [, DateTimeZone $timezone ]] )

    an - in diesem Fall offensichtlich der Konstruktor, der dem new DateTime() entspricht.
    Anderes Beispiel date_date_set():

    Zitat

    void DateTime::setDate ( int $year , int $month , int $day )

    entspricht $objekt->setDate( 2008, 12, 24 ); usw.
    Der Scope Operator [noparse](::)[/noparse] deutet auf OO-Zugriff hin.


    Die Dokumentation ist nicht immer so logisch aufgebaut wie man es gerne hätte, aber meistens kommt man doch ganz gut damit zurecht. ;)


    [edit]Du kannst auch so feststellen welche Methoden die Klasse hat:

    PHP
    1. echo "<pre>" .print_r( get_class_methods( "DateTime" ), true ). "</pre>";

    [/edit]