PHP: Datumsrechnerei
Für ein Projekt musst ich eine Datumsliste erstellen. Hierzu gibt es verschiedene Möglichkeiten, die ich gerne hier aufführen möchte, da hierzu bereits mehrere Fragen aufgetaucht sind.
Seit PHP5 gibt es hierfür date_create() und date_add(). Ein Beispiel für eine Auswahlbox lautet:
<? $beginn = "2011-01-01"; $ende = "2011-12-31"; function mk_select($name, $start, $end) { $date = date_create($start); $limit = date_create($end); $ret = "<select name=\"".$name."\">\"); if($date && $limit) { while($date < $limit) { $ret .= " <option value=\"".date_format($date, 'Y-m-d')."\">".date_format($date, 'Y-m-d')."</option>\n"; date_add($date, date_interval_create_from_date_string('1 month')); } } $ret .= "</select><br />\n"); return($ret); } echo(mk_select("test_select", $beginn, $ende)); ?>
Es wird zwei Daten erzeugt und immer mit Hilfe der Funktion date(…) der aktuelle Monat ausgegeben. Anschließend wird ein Monat hinzugefügt über date_add(). Dabei kümmert sich die Funktion automatisch darum, wieviele Tage ein Monat hat.
Wer mit einer älteren PHP Version zu kämpfen hat versucht folgendes Beispiel:
<? $beginn = "2011-01-01"; $ende = "2011-12-31"; function mk_select($name, $start, $end) { $ret = "<select name=\"".$name."\">\"); $d1 = explode("-", $start); $d2 = explode("-", $end); $t1 = mktime(0, 0, 0, $d1[1], 2, $d1[0]); $t2 = mktime(0, 0, 0, $d2[1], $d2[2], $d2[0]); if($t1 && $t2) { while($t1 < $t2) { $ret .= " <option value=\"".date('Y-m-01', $t1)."\">".date('Y-m-01', $t1)."</option>\n"; } $t1 = $t1 + date("t", $t1)*24*60*60; } $ret .= "</select><br />\n"); } echo(mk_select("test_select", $beginn, $ende)); ?>
Hierbei wird über mktime(…) ein Unixdatum (Sekunden seit 01.01.1970) erzeugt und die entsprechenden Sekunden über date(„t“, $t1)*24*60*60 hinzugefügt. Der Parameter t gibt dabei die Tage im entsprechenden Monat zurück. Bei der Ausgabe ist zu beachten, dass mktime die Zeitzone berücksichtigt. Deswegen ist in $t1 = mktime(0, 0, 0, $d1[1], 2, $d1[0]) der 5. Parameter auf 2 (Stunden) gesetzt, sonst wird zweimal der Oktober und kein November ausgegeben.
Ähnliche Spielerein lassen sich mit Hilfe von Mysql machen. Dabei berechnet Mysql das Datum das man bequem dann in PHP weiterverarbeiten kann.
<? // Datenbankaufbau $res = mysql_query("SELECT DATE_ADD('2011-10-10 00:00:00', -> INTERVAL 1 Month);"); // Auswertung ?>