So berechnen Sie die Anzahl der Tage zwischen Daten in PHP: 5 fatale Fehler

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

„Wie viele Tage sind vergangen?“ – eine Frage, die Anfänger scheitern lässt

\n\n

Jeder 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\n

Wir 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.

\n\n

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\n

Fehler Nr. 1: Direkte Subtraktion von Unix-Zeitstempeln

\n\n

Der 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\n

Wie man es korrigiert

\n

Verwenden Sie DateTime-Objekte und die Methode diff(). Sie berücksichtigen alle Zeitsprünge:

\n\n
<?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\n

Die Arbeit mit der Datumsdifferenz in PHP über DateTime::diff ist der Industriestandard. Merken Sie sich dieses Muster.

\n\n

Fehler Nr. 2: Ignorieren der Zeitzone

\n\n

Stellen 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“.

\n\n

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\n

Lö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\n

Verwenden 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\n

Fehler Nr. 3: Verwechslung von days und format('%a')

\n\n

Das DateInterval-Objekt hat eine Eigenschaft days und eine Methode format('%a'). Es scheint, als wäre es dasselbe. Aber es gibt einen Unterschied:

\n\n
    \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, gibt d 4 zurück (der Rest nach Abzug eines Monats).
  • \n
\n\n

Anfänger verwechseln oft d und days. Das Ergebnis: 4 Tage statt 35. Daraus resultieren Fehler in Berichten, Abrechnungen und Aufgabenplanern.

\n\n

Ü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\n

Wenn Sie genau die Anzahl der Tage zwischen zwei Daten benötigen, nehmen Sie

Blogs

Buchempfehlungen