Unterschied zwischen Daten in PHP: Vom Anfänger zum Profi

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 man die Differenz zwischen zwei Daten in PHP berechnet: Vollständige Anleitung mit Beispielen

\n\n

Haben Sie sich jemals mit der Aufgabe konfrontiert gesehen: „Wie viele Tage sind seit der Registrierung des Benutzers vergangen?“, „Wie alt ist eine Person anhand des Geburtsdatums?“ oder „In wie vielen Stunden endet die Aktion?“? Wenn ja, dann haben Sie sich sicherlich gefragt: Wie berechnet man die Differenz zwischen zwei Daten in PHP? Dies ist eine der häufigsten Fragen auf Stack Overflow, und das zu Recht: Die Arbeit mit Daten ist ein grundlegendes, aber tückisches Thema.

\n\n

In diesem Artikel werden wir drei Hauptansätze untersuchen: das klassische strtotime(), das moderne objektorientierte DateTime und das leistungsstarke Drittanbieter-Paket Carbon. Sie erfahren nicht nur „wie es geht“, sondern auch, welche Methode Sie für Ihre Aufgabe wählen sollten. Los geht's!

\n\n

Warum ist einfaches Subtrahieren von Daten eine schlechte Idee?

\n\n

Anfänger versuchen oft Folgendes:

\n\n
<?php\n$date1 = '2024-01-15';\n$date2 = '2024-01-10';\n$diff = $date2 - $date1; // Fehler! Strings können nicht subtrahiert werden\n?>\n
\n\n

PHP kann keine Strings subtrahieren, selbst wenn sie wie Daten aussehen. Das Ergebnis ist 0 oder eine Warnung. Selbst wenn Sie strtotime() verwenden und Unix-Zeitstempel erhalten, liefert die einfache Subtraktion von Sekunden nur die Anzahl der Sekunden, nicht ein benutzerfreundliches Format wie „2 Tage 3 Stunden 15 Minuten“. Dafür sind spezielle Werkzeuge erforderlich.

\n\n

Ansatz 1: Der Klassiker — strtotime() und manuelle Berechnungen

\n\n

Diese Methode ist allen bekannt, die mit PHP 4 oder 5 begonnen haben. Die Funktion strtotime() wandelt eine textuelle Datumsdarstellung in einen Unix-Zeitstempel um (Anzahl der Sekunden seit dem 1. Januar 1970). Dann subtrahieren wir die Zeitstempel und teilen durch die Anzahl der Sekunden pro Tag.

\n\n

Beispiel: Differenz in Tagen

\n\n
<?php\n$date1 = strtotime('2024-12-25');\n$date2 = strtotime('2024-12-20');\n\n$seconds_diff = $date1 - $date2;\n$days_diff = floor($seconds_diff / (60 * 60 * 24));\n\necho "Differenz: $days_diff Tage"; // Gibt aus: Differenz: 5 Tage\n?>\n
\n\n

Vorteile: Einfachheit, keine Objekte erforderlich, arbeitet schnell.

\n\n

Nachteile:
\n- Keine Unterstützung für Zeitzonen (immer UTC).
\n- Bei Sommer-/Winterzeitumstellung ist ein Fehler von 1 Stunde möglich (und damit auch von 1 Tag, wenn die Umstellungsgrenze in Ihr Intervall fällt).
\n- Um die Differenz in Monaten oder Jahren zu erhalten, muss eine komplexe Logik unter Berücksichtigung von Schaltjahren geschrieben werden.

\n\n

Wann verwenden: Nur für grobe Berechnungen (z. B. „sind mehr als 30 Tage vergangen?“) oder wenn Sie eine alte Codebasis haben.

\n\n

Ansatz 2: DateTime und DateInterval — Moderner PHP-Standard

\n\n

Seit PHP 5.2 gibt es in der Sprache die leistungsstarke Klasse DateTime. In Kombination mit DateInterval löst sie 95 % der Aufgaben im Umgang mit Daten. Dies ist die empfohlene Methode zur Berechnung der Differenz zwischen zwei Daten in PHP.

\n\n

Basisbeispiel: Differenz in Tagen, Monaten und Jahren

\n\n
<?php\n$date1 = new DateTime('2024-01-15');\n$date2 = new DateTime('2023-11-10');\n$interval = $date1->diff($date2);\n\necho $interval->format('%y Jahre, %m Monate, %d Tage');\n// Gibt aus: 0 Jahre, 2 Monate, 5 Tage\n?>\n
\n\n

Die Magie liegt darin, dass diff() automatisch Schaltjahre, unterschiedliche Monatslängen und sogar Zeitzonen (falls angegeben) berücksichtigt.

\n\n

Zugriff auf einzelne Komponenten

\n\n
<?php\n$date1 = new DateTime('2024-12-25');\n$date2 = new DateTime('2024-01-01');\n$interval = $date1->diff($date2);\n\necho "Jahre: " . $interval->y . "<br>";\necho "Monate: " . $interval->m . "<br>";\necho "Tage: " . $interval->d . "<br>";\necho "Gesamttage (total): " . $interval->days . "<br>";\n// Gibt aus:\n// Jahre: 0\n// Monate: 11\n// Tage: 24\n// Gesamttage (total): 359\n?>\n
\n\n

Beachten Sie die Eigenschaft days – dies ist die Gesamtzahl der Tage im Intervall (im Gegensatz zu d, das anzei

Blogs

Buchempfehlungen