W3docs

date_diff()

Erfahren Sie, wie PHP's date_diff() den Unterschied zwischen zwei Daten berechnet, ein DateInterval zurückgibt und Ergebnisse mit Platzhaltern wie %a, %y und %R formatiert.

Die Funktion date_diff() gibt die Differenz zwischen zwei DateTime-Objekten als DateInterval-Objekt zurück. Sie ist der prozedurale Alias der Methode DateTime::diff() und der Standardweg, um in PHP Fragen zu beantworten wie „Wie viele Tage noch bis zur Deadline?" oder „Wie alt ist dieser Nutzer?". Dieser Leitfaden erklärt die Syntax, das zurückgegebene DateInterval, die format()-Platzhalter zur Darstellung des Ergebnisses und häufige Stolperfallen.

Syntax

date_diff(DateTime $baseObject, DateTime $targetObject, bool $absolute = false): DateInterval
  • $baseObject — das Startdatum (das Datum, von dem aus gemessen wird).
  • $targetObject — das Enddatum (das Datum, bis zu dem gemessen wird).
  • $absolute — wenn true, ist das Intervall immer positiv und $interval->invert ist 0. Standardwert ist false, was das Vorzeichen beibehält (negativ, wenn $targetObject früher als $baseObject liegt).

Die Funktion gibt ein DateInterval-Objekt zurück oder false bei einem Fehler.

Differenz zwischen zwei Daten berechnen

date_diff() nimmt zwei DateTime-Objekte und gibt ein DateInterval zurück, das die Lücke zwischen ihnen beschreibt.

Datumsunterschiede in PHP berechnen

php— editable, runs on the server

Dies gibt +31 days aus. Wir erstellen zwei DateTime-Objekte für den 1. Januar und den 1. Februar 2022, übergeben sie an date_diff() und formatieren das resultierende DateInterval. Der Platzhalter %R gibt das Vorzeichen aus (+ oder -) und %a gibt die Gesamtanzahl der Tage zwischen den Daten aus.

date_diff($a, $b) ist exakt gleichwertig mit $a->diff($b) — verwenden Sie, was in Ihrem Code lesbarer ist:

$interval = $first_date->diff($second_date);

Das DateInterval-Objekt lesen

Das zurückgegebene DateInterval unterteilt die Differenz in separate Kalenderkomponenten, die jeweils als öffentliche Eigenschaft verfügbar sind:

EigenschaftBedeutung
$interval->yJahre
$interval->mMonate (0–11)
$interval->dTage (0–30)
$interval->hStunden
$interval->iMinuten
$interval->sSekunden
$interval->daysGesamtanzahl der Tage über das gesamte Intervall
$interval->invert1, wenn das Intervall negativ ist, andernfalls 0
<?php

$start = new DateTime('2020-03-15');
$end   = new DateTime('2022-07-20');

$diff = $start->diff($end);

echo "{$diff->y} years, {$diff->m} months, {$diff->d} days";
echo " ({$diff->days} total days)";

Dies gibt 2 years, 4 months, 5 days (857 total days) aus. Beachten Sie den Unterschied zwischen $diff->d (die Tageskomponente, 5) und $diff->days (die Gesamtanzahl der Tage, 857) — deren Verwechslung ist der häufigste DateInterval-Fehler.

Das Ergebnis formatieren

DateInterval::format() wandelt das Intervall mithilfe von %-präfixierten Platzhaltern in einen String um. Die nützlichsten:

PlatzhalterAusgabe
%y / %m / %dJahre / Monate / Tage (Komponente)
%aGesamtanzahl der Tage
%h / %i / %sStunden / Minuten / Sekunden
%RVorzeichen: - für negativ, + für positiv
%rVorzeichen: - für negativ, leer für positiv
%%Ein literales %-Zeichen
<?php

$diff = (new DateTime('2022-01-01'))->diff(new DateTime('2023-04-10'));

echo $diff->format('%y years, %m months and %d days');

Dies gibt 1 years, 3 months and 9 days aus.

Vorzeichen und absolute Differenzen

Standardmäßig behält das Intervall sein Vorzeichen, sodass die Reihenfolge der Argumente eine Rolle spielt. Übergeben Sie true als drittes Argument, um ein absolutes (immer positives) Ergebnis zu erzwingen:

<?php

$later   = new DateTime('2022-02-01');
$earlier = new DateTime('2022-01-01');

// Target is earlier than base → negative interval
echo $later->diff($earlier)->format('%R%a days'), "\n"; // -31 days

// Force an absolute difference
echo date_diff($later, $earlier, true)->format('%R%a days'); // +31 days

Ein praktisches Beispiel: Alter berechnen

Ein häufiger Anwendungsfall in der Praxis ist die Berechnung des Alters einer Person in ganzen Jahren anhand ihres Geburtstags:

<?php

$birthday = new DateTime('1995-06-21');
$today    = new DateTime('2026-06-21');

$age = $birthday->diff($today)->y;

echo "Age: {$age} years";

Dies gibt Age: 31 years aus. Da date_diff() den Kalender versteht, werden Schaltjahre und unterschiedliche Monatslängen automatisch berücksichtigt — Sie müssen Sekunden nicht selbst durch 86400 dividieren.

Fazit

date_diff() (und seine identische Methodenform DateTime::diff()) ist der zuverlässige, kalenderbasierte Weg, um in PHP die Lücke zwischen zwei Daten zu messen. Lesen Sie die aufgeschlüsselten Komponenten (y, m, d) für eine benutzerfreundliche Ausgabe, verwenden Sie days für eine Gesamttaganzahl, und denken Sie daran, dass die Reihenfolge der Argumente das Vorzeichen bestimmt, es sei denn, Sie übergeben $absolute = true. Um die zu vergleichenden Daten zu erstellen, siehe date_create() und date_format(); zum Addieren oder Subtrahieren von Intervallen siehe date_add(), date_sub() und date_modify(). Weitere Informationen zu den oben gezeigten Platzhaltern finden Sie unter date_interval_format().

graph TD;
A[date_diff two DateTime objects] --> B[Returns a DateInterval];
B --> C[Read components: y, m, d, h, i, s];
B --> D[Read total days: days];
B --> E[Format with %y %m %d %a %R];

Wir hoffen, dass dieser Leitfaden Ihnen auf Ihrem PHP-Entwicklungsweg hilfreich war. Wenn Sie Fragen oder Kommentare haben, hinterlassen Sie diese gerne unten.

Übungen

Übung
Was macht die PHP-Funktion date_diff()?
Was macht die PHP-Funktion date_diff()?
Was this page helpful?