Datum in PHP vergleichen – so geht’s

php_date_compareWie vergleicht man eigentlich 2 Daten (Daten = Plural von Datum) in PHP miteinander? Die Frage klingt erst mal einfacher als es ist.
Der erste Gedanke, der einem meistens kommt, ist folgender. Wir speichern 2 Daten als String und vergleichen diese.

 

 

Vorüberlegung

<?php
$date1 = "2012-1-12";
$date2 = "2011-10-12";

if ($date1 > $date2)
 echo "$date1 ist neuer als $date2";
else
 echo "$date1 ist &auml;lter als $date2";
?>

Ausgabe:

2012-1-12 ist neuer als 2011-10-12

Auf den ersten Blick scheint das auch eine funktionierende Lösung zu sein. Was jedoch, wenn die beiden Daten in einem unterschiedlichen Format vorliegen?

<?php
$date1 = "12-1-12";
$date2 = "2011-10-12";

if ($date1 > $date2)
 echo "$date1 ist neuer als $date2";
else
 echo "$date1 ist &auml;lter als $date2";
?>

Ausgabe:

12-1-12 ist älter als 2011-10-12

Nun wird das Datum in 2012 auf einmal als kleiner als das Datum in 2011 deklariert, was natürlich falsch ist. Doch aus PHP-Sicht ist dieses Verhalten korrekt, schließlich wurden ja zwei Strings verglichen und das 2012er Datum hatte definitiv den kleineren/kürzeren String.

PHP 7 und MySQL. Das umfassende Praxistraining. Dynamische Webseiten entwickeln, Datenbanken erstellen, Webseiten absichern: Das umfassende ... Administration, Sicherheit
PHP 7 und MySQL. Das umfassende Praxistraining. Dynamische Webseiten entwickeln, Datenbanken erstellen, Webseiten absichern: Das umfassende ... Administration, Sicherheit
PHP-Grundlagen praxisnah erklärt. Auch ohne Vorkentnisse!; Der Lernkurs mit Jan Unger – kompetent und kurzweilig. Mit komplettem Übungsmaterial
24,14 EUR

Datum korrekt vergleichen

Eine funktionierende Lösung wäre es, die Daten zuerst in Timestamps (dt.: Zeitstempel) umzuwandeln und diese numerischen Timestamps dann miteinander zu vergleichen. Zur Umwandlung eines Datum-Strings in einen Timestamp bietet PHP die Funktion strtotime($zeitString), die ein Datum oder eine Zeitangabe annimmt und den entsprechenden Timestamp zurückliefert.

<?php
$date1 = "12-1-12";
$date2 = "2011-10-12";
$dateTimestamp1 = strtotime($date1);
$dateTimestamp2 = strtotime($date2);

if ($dateTimestamp1 > $dateTimestamp2)
 echo "$date1 ist neuer als $date2";
else
 echo "$date1 ist &auml;lter als $date2";
?>

Ausgabe:

12-1-12 ist neuer als 2011-10-12

Jedoch führen bekanntlich viele Wege nach Rom und so gibt es auch hier noch weitere Lösungen für das Ausgangsproblem. So wäre eine weitere Lösung die Verwendung der DateTime-Klasse, die PHP ab der Version 5.2.0 zur Verfügung stellt.

<?php
$date1 = new DateTime("12-1-12");
$date2 = new DateTime("2011-10-12");

if ($date1 > $date2)
 echo $date1->format("Y-m-d")." ist neuer als ".$date2->format("Y-m-d");
else
 echo $date1->format("Y-m-d")." ist &auml;lter als ".$date2->format("Y-m-d");
?>

Ausgabe:

2012-01-12 ist neuer als 2011-10-12

Verwendet man die auf der DateTime-Klasse basierende Lösung, hat man auch gleich noch beide Daten einheitlich formatiert. Gut, man könnte in der ersten Lösung auch die date()-Funktion benutzen, um die Daten zu formatieren, aber das würde den ersten Lösungsweg noch länger machen. Am Ende bleibt es Geschmackssache, welchen Weg man für den Vergleich zweier Daten geht.

Wie vergleicht ihr zwei Daten in PHP? Nutzt ihr einen der beiden aufgezeigten Wege oder geht ihr einen anderen? Mich würde interessieren, wie ihr euch dem Problem annehmt.

9 Kommentare

  1. Maybe in the future it’ll do even better in those areas, but for now it’s a fantastic way to organize and listen to your music and videos, and is without peer in that regard. The iPod’s strengths are its web browsing and apps.

  2. Andreassays:

    Da ist ein kleiner Fehler in der Zeile:
    $dataTimestamp2 = strtotime($data2);

    Es müsste date2 heißen.

    • Hallo Andreas,
      vielen Dank für den Hinweis! Da hatte sich wohl der Fehlerteufel eingeschlichen. Ich habe den Artikel nun überarbeitet.

      Viele Grüße,
      Raffi

  3. Also ich mach das auch mittels strtotime. Ich glaube sogar, dass das die performanteste Lösung ist. DateTime hab ich eigentlich noch nie benötigt.

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.