Florian Herlings, freier Webentwickler aus Düsseldorf.

Menschenlesbares Zeithandling mit PHP

Das Arbeiten mit Zeit ist in PHP zugegebener Maßen nicht sonderlich komfortabel. Trotzdem ist es eines der größeren Themen im Web-Entwickler-Alltag. Falls sich mir die Möglichkeit bietet, lasse ich das Zeithandling immer von MySQL machen, da dies diverse Vorteile bietet („Die Datums- und Zeit-Funktionen in MySQL“).

Oft hat man es jedoch mit Legacy-Systemen zu tun, die Timestamps verwenden, wodurch man keine Wahl hat als diese vorerst weiter zu benutzen. Doch auch PHP bietet ein paar „schönere“ Hilfestellungen, als das rohe Berechnen von Timestamps. Exemplarisch möchte ich dies mit der strtotime-Funktion zeigen.

Das Rechnen mit rohen Timestamps

Will man zum Beispiel validieren, ob ein Nutzer bereits 18 Jahre alt ist, so lässt man ihn in einem Formular sein Geburtsdatum eingeben und prüft die Daten dann in einer Funktion auf Gültigkeit.

//Die Daten aus dem Formular filtern 
$tag   =   filter_var($_GET['tag'], FILTER_SANITIZE_NUMBER_INT);
$monat = filter_var($_GET['monat'], FILTER_SANITIZE_NUMBER_INT);
$jahr  =   filter_var($_GET['jahr'], FILTER_SANITIZE_NUMBER_INT);
//Funktion aufrufen 
$volljaehrig = ist_volljaehrig($tag, $monat, $jahr);

Die Gültigkeit wird geprüft, indem man aus den eingegebenen Daten den Timestamp des Geburtsdatums ermittelt, einen Timestamp der genau 18 Jahre zurück liegt berechnet und die beiden Timestamps miteinander vergleicht:

function ist_volljaehrig($tag, $monat, $jahr) { 
  $geburtstag_des_users = gmmktime(0, 0, 0, $monat, $tag, $jahr);
  $jetzt_vor_18_jahren = time() - (60*60*24*365*18);
  return (boolean)($geburtstag_des_users < $jetzt_vor_18_jahren);
}

Schaut man sich den Code jedoch genauer an, fallen einem drei Dinge auf:

Das Rechnen mit der strtotime-Funktion

Abhilfe für dieses Problem kann hier die PHP-Funktion strtotime schaffen: Dieser Funktion übergibt man einen String der menschen-lesbare Zeitangaben enthält und die Funktion gibt den daraus resultierenden Timestamp zurück.

Beispiele:

Da auch Kombinationen von Strings erlaubt sind, vereinfacht dies unsere Funktion zum Validieren der Volljährigkeit erheblich und lässt sich sogar fast „lesen“ (gib zurück, ob jetzt später ist als der 18.Geburtstag):

function ist_volljaehrig($tag, $monat, $jahr) { 
  return (strtotime('now') > strtotime("$tag.$monat.$jahr + 18 years"));
}

Weitere Informationen zu der Funktion finden sich auf http://www.php.net/strtotime.