Wie berechnet man die Differenz zwischen zwei Daten mit PHP?

Lesezeit: 8 Minuten

Ich habe zwei Daten der Form:

Start Date: 2007-03-24 
End Date: 2009-06-26

Jetzt muss ich den Unterschied zwischen diesen beiden in der folgenden Form finden:

2 years, 3 months and 2 days

Wie kann ich das in PHP machen?

  • 2 Jahre 94 Tage. Die Berechnung der Monate unter Berücksichtigung von Schaltjahren wäre problematisch. Wie genau muss das sein?

    – dbasnett

    24. März 2009 um 12:35 Uhr

  • mögliches Duplikat von Wie berechne ich die relative Zeit?

    – Cole Tobin

    26. Juni 2014 um 5:00 Uhr

Wie berechnet man die Differenz zwischen zwei Daten mit PHP
Emil h

Verwenden Sie dies für Legacy-Code (PHP < 5.3). Eine aktuelle Lösung finden Sie in der Antwort von Jurka unten

Sie können strtotime() verwenden, um zwei Datumsangaben in Unix-Zeit umzuwandeln und dann die Anzahl der Sekunden zwischen ihnen zu berechnen. Daraus lassen sich recht einfach unterschiedliche Zeiträume berechnen.

$date1 = "2007-03-24";
$date2 = "2009-06-26";

$diff = abs(strtotime($date2) - strtotime($date1));

$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));

printf("%d years, %d months, %d days\n", $years, $months, $days);

Bearbeiten: Offensichtlich ist der bevorzugte Weg, dies zu tun, wie unten von Jurka beschrieben. Mein Code wird im Allgemeinen nur empfohlen, wenn Sie kein PHP 5.3 oder besser haben.

Mehrere Personen in den Kommentaren haben darauf hingewiesen, dass der obige Code nur eine Annäherung ist. Ich glaube immer noch, dass das für die meisten Zwecke in Ordnung ist, da die Verwendung eines Bereichs eher dazu dient, ein Gefühl dafür zu vermitteln, wie viel Zeit vergangen ist oder verbleibt, als Präzision zu liefern – wenn Sie dies tun möchten, geben Sie einfach das Datum aus.

Trotz alledem habe ich mich entschlossen, die Beschwerden anzugehen. Wenn Sie wirklich einen genauen Bereich benötigen, aber keinen Zugriff auf PHP 5.3 haben, verwenden Sie den folgenden Code (er sollte auch in PHP 4 funktionieren). Dies ist eine direkte Portierung des Codes, den PHP intern verwendet, um Bereiche zu berechnen, mit der Ausnahme, dass die Sommerzeit nicht berücksichtigt wird. Das bedeutet, dass es höchstens eine Stunde daneben liegt, aber ansonsten sollte es stimmen.

<?php

/**
 * Calculate differences between two dates with precise semantics. Based on PHPs DateTime::diff()
 * implementation by Derick Rethans. Ported to PHP by Emil H, 2011-05-02. No rights reserved.
 * 
 * See here for original code:
 * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/tm2unixtime.c?revision=302890&view=markup
 * http://svn.php.net/viewvc/php/php-src/trunk/ext/date/lib/interval.c?revision=298973&view=markup
 */

function _date_range_limit($start, $end, $adj, $a, $b, $result)
{
    if ($result[$a] < $start) {
        $result[$b] -= intval(($start - $result[$a] - 1) / $adj) + 1;
        $result[$a] += $adj * intval(($start - $result[$a] - 1) / $adj + 1);
    }

    if ($result[$a] >= $end) {
        $result[$b] += intval($result[$a] / $adj);
        $result[$a] -= $adj * intval($result[$a] / $adj);
    }

    return $result;
}

function _date_range_limit_days($base, $result)
{
    $days_in_month_leap = array(31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $days_in_month = array(31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    _date_range_limit(1, 13, 12, "m", "y", &$base);

    $year = $base["y"];
    $month = $base["m"];

    if (!$result["invert"]) {
        while ($result["d"] < 0) {
            $month--;
            if ($month < 1) {
                $month += 12;
                $year--;
            }

            $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
            $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];

            $result["d"] += $days;
            $result["m"]--;
        }
    } else {
        while ($result["d"] < 0) {
            $leapyear = $year % 400 == 0 || ($year % 100 != 0 && $year % 4 == 0);
            $days = $leapyear ? $days_in_month_leap[$month] : $days_in_month[$month];

            $result["d"] += $days;
            $result["m"]--;

            $month++;
            if ($month > 12) {
                $month -= 12;
                $year++;
            }
        }
    }

    return $result;
}

function _date_normalize($base, $result)
{
    $result = _date_range_limit(0, 60, 60, "s", "i", $result);
    $result = _date_range_limit(0, 60, 60, "i", "h", $result);
    $result = _date_range_limit(0, 24, 24, "h", "d", $result);
    $result = _date_range_limit(0, 12, 12, "m", "y", $result);

    $result = _date_range_limit_days(&$base, &$result);

    $result = _date_range_limit(0, 12, 12, "m", "y", $result);

    return $result;
}

/**
 * Accepts two unix timestamps.
 */
function _date_diff($one, $two)
{
    $invert = false;
    if ($one > $two) {
        list($one, $two) = array($two, $one);
        $invert = true;
    }

    $key = array("y", "m", "d", "h", "i", "s");
    $a = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $one))));
    $b = array_combine($key, array_map("intval", explode(" ", date("Y m d H i s", $two))));

    $result = array();
    $result["y"] = $b["y"] - $a["y"];
    $result["m"] = $b["m"] - $a["m"];
    $result["d"] = $b["d"] - $a["d"];
    $result["h"] = $b["h"] - $a["h"];
    $result["i"] = $b["i"] - $a["i"];
    $result["s"] = $b["s"] - $a["s"];
    $result["invert"] = $invert ? 1 : 0;
    $result["days"] = intval(abs(($one - $two)/86400));

    if ($invert) {
        _date_normalize(&$a, &$result);
    } else {
        _date_normalize(&$b, &$result);
    }

    return $result;
}

$date = "1986-11-10 19:37:22";

print_r(_date_diff(strtotime($date), time()));
print_r(_date_diff(time(), strtotime($date)));

  • Wenn Sie die DateTime-Klasse verwenden, können Sie $date->format(‘U’) verwenden, um den Unix-Zeitstempel zu erhalten.

    – Jon Cram

    7. August 2009 um 13:26 Uhr

  • Es ist nicht wahr, wenn Sie sich mit Sommer-/Winterzeit auseinandersetzen müssen. In diesem speziellen Fall, wenn Sie die Sommer-/Winterzeit umstellen, entspricht ein Tag 23 oder 25 Stunden.

    – Arno

    21. Dezember 2009 um 15:54 Uhr

  • Nun, das gleiche Argument könnte man für Schaltjahre anführen. Das wird auch nicht berücksichtigt. Trotzdem bin ich nicht davon überzeugt, dass Sie das überhaupt berücksichtigen wollen, da wir hier über eine Bandbreite sprechen. Die Semantik für einen Bereich ist etwas anders als für ein absolutes Datum.

    – Emil H

    21. Dezember 2009 um 20:35 Uhr

  • Diese Funktion ist falsch. Es ist gut für eine Annäherung, aber falsch für genaue Bereiche. Zum einen wird davon ausgegangen, dass ein Monat 30 Tage hat, was bedeutet, dass zwischen dem 1. Februar und dem 1. März die gleiche Differenz an Tagen besteht wie zwischen dem 1. Juli und dem 1. August (unabhängig vom Schaltjahr).

    – enobrev

    11. April 2011 um 19:14 Uhr

  • In PHP befinden sich Referenzvariablen in der Funktionssignatur, nicht im Aufruf. Bewegen Sie alle Ihre & zu den Unterschriften.

    – Paul Tarjan

    19. März 2013 um 9:32 Uhr

  • DateTime() ist keine Funktion, sondern ein Objekt und seit PHP 5.2 vorhanden. Stellen Sie sicher, dass Ihr Server dies unterstützt.

    – Madaras Geist

    22. Juli 2013 um 16:21 Uhr

  • @SecondRikudo DateTime::Diff benötigen PHP 5.3.0

    – PhoneixS

    7. Juli 2014 um 9:21 Uhr


  • Wir haben ein Problem, tauschen first_date zu second_date aus und wir bekommen das gleiche Ergebnis? Warum nicht 0 Tage 0 Stunden 0 Minuten 0 Sekunden oder nur 0 sagen? 2012-11-30 17:03:30 gleiches Ergebnis erhalten.

    – EgoistEntwickler

    22. September 2017 um 8:49 Uhr

  • Weil diff Ihnen die Differenz zwischen den beiden Zeiten gibt. Die Differenz ist nicht 0, egal welches Datum später kommt.

    – Madaras Geist

    22. September 2017 um 16:11 Uhr

  • Das ist ein Ja wirklich gute Antwort, da es eine klare Funktion bietet, die von überall in einer Codebasis ohne viel Zeitaufwand aufgerufen werden kann. Andere Antworten ermöglichen es Ihnen, echoed calcs on the fly zu löschen, die die Symptome ansprechen, anstatt das Problem zu lösen … Das einzige Element, das ich hinzugefügt habe (und so ziemlich alle anderen Posts decken dies nicht ab), ist die Pluralisierung von $interval-Elementen wenn mehr als 1.

    – Nickhar

    3. Januar 2019 um 23:12 Uhr

1647097449 410 Wie berechnet man die Differenz zwischen zwei Daten mit PHP
haldonno

Zeigen Sie Stunden und Minuten und Sekunden an..

$date1 = "2008-11-01 22:45:00"; 

$date2 = "2009-12-04 13:44:01"; 

$diff = abs(strtotime($date2) - strtotime($date1)); 

$years   = floor($diff / (365*60*60*24)); 
$months  = floor(($diff - $years * 365*60*60*24) / (30*60*60*24)); 
$days    = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));

$hours   = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24)/ (60*60)); 

$minuts  = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60)/ 60); 

$seconds = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minuts*60)); 

printf("%d years, %d months, %d days, %d hours, %d minuts\n, %d seconds\n", $years, $months, $days, $hours, $minuts, $seconds); 

  • Wahrscheinlich wird dies nicht das genaue Ergebnis liefern.

    – Delfin

    5. August 2011 um 8:24 Uhr

  • Und ist eine schreckliche Lösung, es sei denn, Sie sind gezwungen, eine schrecklich veraltete Version von PHP zu verwenden …

    – rdlowrey

    24. März 2012 um 17:50 Uhr

  • Nicht so TROCKEN. Beispielsweise wird 60*60*24 15 Mal wiederholt. Es lebe die Wiederverwendung von Copy-Paste!

    – Peter Mortensen

    8. April 2014 um 23:07 Uhr


  • Was ist mit Schaltjahren? Ein Jahr hat im Durchschnitt nicht 365 Tage.

    – Peter Mortensen

    8. April 2014 um 23:10 Uhr

  • Dieser Code geht davon aus, dass ein Monat durchschnittlich 30 Tage hat. Selbst wenn man von 365 Tagen für ein Jahr ausgeht, hat ein durchschnittlicher Monat 365 / 12 = 30,42 Tage (ungefähr).

    – Peter Mortensen

    8. April 2014 um 23:16 Uhr

1647097450 182 Wie berechnet man die Differenz zwischen zwei Daten mit PHP
Peter Mortensen

Schauen Sie sich den folgenden Link an. Dies ist die beste Antwort, die ich bisher gefunden habe .. 🙂

function dateDiff ($d1, $d2) {

    // Return the number of days between the two dates:    
    return round(abs(strtotime($d1) - strtotime($d2))/86400);

} // end function dateDiff

Bei der Übergabe der Datumsparameter spielt es keine Rolle, welches Datum früher oder später liegt. Die Funktion verwendet den absoluten Wert von PHP ABS(), um immer eine positive Zahl als Anzahl der Tage zwischen den beiden Daten zurückzugeben.

Beachten Sie, dass die Anzahl der Tage zwischen den beiden Daten NICHT beide Daten enthält. Wenn Sie also nach der Anzahl der Tage suchen, die durch alle Daten zwischen und einschließlich der eingegebenen Daten dargestellt werden, müssen Sie dem Ergebnis dieser Funktion eins (1) hinzufügen.

Beispielsweise beträgt die Differenz (wie von der obigen Funktion zurückgegeben) zwischen 2013-02-09 und 2013-02-14 5. Aber die Anzahl der Tage oder Daten, die durch den Datumsbereich 2013-02-09 – 2013-02- dargestellt werden 14 ist 6.

http://www.bizinfosys.com/php/date-difference.html

  • Wahrscheinlich wird dies nicht das genaue Ergebnis liefern.

    – Delfin

    5. August 2011 um 8:24 Uhr

  • Und ist eine schreckliche Lösung, es sei denn, Sie sind gezwungen, eine schrecklich veraltete Version von PHP zu verwenden …

    – rdlowrey

    24. März 2012 um 17:50 Uhr

  • Nicht so TROCKEN. Beispielsweise wird 60*60*24 15 Mal wiederholt. Es lebe die Wiederverwendung von Copy-Paste!

    – Peter Mortensen

    8. April 2014 um 23:07 Uhr


  • Was ist mit Schaltjahren? Ein Jahr hat im Durchschnitt nicht 365 Tage.

    – Peter Mortensen

    8. April 2014 um 23:10 Uhr

  • Dieser Code geht davon aus, dass ein Monat durchschnittlich 30 Tage hat. Selbst wenn man von 365 Tagen für ein Jahr ausgeht, hat ein durchschnittlicher Monat 365 / 12 = 30,42 Tage (ungefähr).

    – Peter Mortensen

    8. April 2014 um 23:16 Uhr

1647097450 182 Wie berechnet man die Differenz zwischen zwei Daten mit PHP
Peter Mortensen

<?php
    $today = strtotime("2011-02-03 00:00:00");
    $myBirthDate = strtotime("1964-10-30 00:00:00");
    printf("Days since my birthday: ", ($today - $myBirthDate)/60/60/24);
?>

  • Die Frage fragte nach der Differenz als Anzahl von Jahre, Monate und Tage. Dies gibt die Differenz als Gesamtzahl der Tage aus.

    – Peter Mortensen

    8. April 2014 um 23:40 Uhr


994110cookie-checkWie berechnet man die Differenz zwischen zwei Daten mit PHP?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy