„Wie viele Tage sind vergangen?“ – eine Frage, die Anfänger scheitern lässt
\n\nJeder PHP-Entwickler steht früher oder später vor der Aufgabe: Herauszufinden, wie viele Tage zwischen zwei Daten vergangen sind. Es scheint so einfach: Man nehme zwei Zeichenketten, subtrahiere eine von der anderen – und fertig. Aber genau hier, auf scheinbar ebenem Boden, werden die tückischsten Fehler gemacht.
\n\nWir haben auf Stack Overflow nachgesehen und eine echte Frage gefunden: „Finding the number of days between two dates“, die Tausende von Aufrufen gesammelt hat. Es stellte sich heraus, dass selbst erfahrene Programmierer in Fallen tappen, die mit Zeitzonen, Unix-Zeitstempeln und dem unerwarteten Verhalten von strtotime() zusammenhängen.
In diesem Artikel analysieren wir die fünf häufigsten Fehler bei der Berechnung der Anzahl der Tage zwischen Daten in PHP und zeigen, wie man sie vermeidet. Machen Sie Ihren Editor bereit – es wird viel Code und praktische Tipps geben.
\n\nFehler Nr. 1: Direkte Subtraktion von Unix-Zeitstempeln
\n\nDer häufigste Fehler ist der Versuch, die Differenz zwischen Daten durch einfaches Subtrahieren von Zeitstempeln zu erhalten:
\n\n<?php\n$date1 = strtotime('2024-01-01');\n$date2 = strtotime('2024-01-10');\n$days = ($date2 - $date1) / (60 * 60 * 24);\necho $days; // 9\n?>\n\nÄußerlich funktioniert alles. Aber versuchen Sie, die Uhren auf Sommerzeit umzustellen. Beim Wechsel zur Sommerzeit verkürzt sich der Tag um eine Stunde, beim Zurückwechsel verlängert er sich. Ergebnis: 9.04166 oder 8.95833 Tage statt genau 9.
\n\nWie man es korrigiert
\nVerwenden Sie DateTime-Objekte und die Methode diff(). Sie berücksichtigen alle Zeitsprünge:
<?php\n$date1 = new DateTime('2024-01-01');\n$date2 = new DateTime('2024-01-10');\n$interval = $date1->diff($date2);\necho $interval->days; // 9 – immer korrekt\n?>\n\nDie Arbeit mit der Datumsdifferenz in PHP über DateTime::diff ist der Industriestandard. Merken Sie sich dieses Muster.
Fehler Nr. 2: Ignorieren der Zeitzone
\n\nStellen Sie sich vor: Ihr Server steht in Europa/Moskau, und ein Benutzer aus New York gibt das Datum „2024-03-10“ ein. Sie erstellen ein DateTime ohne Angabe der Zeitzone. PHP verwendet die Systemzeitzone des Servers. Ergebnis: Die Tagesdifferenz kann um eins „abweichen“.
Besonders kritisch ist dies an Monatsgrenzen und bei Sommerzeitumstellungen. Der Fehler tritt selten auf, aber wenn er in der Produktion auftaucht, ist er sehr schwer zu finden.
\n\nLösung: Geben Sie die Zeitzone explizit an
\n<?php\n$tz = new DateTimeZone('UTC');\n$date1 = new DateTime('2024-03-10', $tz);\n$date2 = new DateTime('2024-03-20', $tz);\n$interval = $date1->diff($date2);\necho $interval->days; // 10 – zuverlässig\n?>\n\nVerwenden Sie für interne Berechnungen immer UTC. Wenn Sie dem Benutzer ein Datum anzeigen müssen, konvertieren Sie es erst in der Ausgabephase in seine lokale Zeitzone.
\n\nFehler Nr. 3: Verwechslung von days und format('%a')
\n\nDas DateInterval-Objekt hat eine Eigenschaft days und eine Methode format('%a'). Es scheint, als wäre es dasselbe. Aber es gibt einen Unterschied:
- \n
$interval->days– die Gesamtanzahl der Tage (unter Berücksichtigung aller Monate und Jahre). Der Wert ist immer korrekt. \n $interval->format('%a')– dasselbe, aber als Zeichenkette. \n $interval->d– nur die Tage ohne Berücksichtigung der Monate. Wenn die Differenz 35 Tage beträgt, gibtd4 zurück (der Rest nach Abzug eines Monats). \n
Anfänger verwechseln oft d und days. Das Ergebnis: 4 Tage statt 35. Daraus resultieren Fehler in Berichten, Abrechnungen und Aufgabenplanern.
Überprüfen Sie immer, welche Eigenschaft Sie verwenden
\n<?php\n$date1 = new DateTime('2024-01-01');\n$date2 = new DateTime('2024-02-05');\n$interval = $date1->diff($date2);\n\necho $interval->days; // 35\necho $interval->d; // 4 – NICHT DASSELBE!\n?>\n\nWenn Sie genau die Anzahl der Tage zwischen zwei Daten benötigen, nehmen Sie