Ustalenie liczby dni pomiędzy dwoma datami

Jak znaleźć liczbę dni pomiędzy dwoma datami za pomocą PHP?

 516
php
Author: Qantas 94 Heavy, 0000-00-00

5 answers

$now = time(); // or your date as well
$your_date = strtotime("2010-01-01");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));
 765
Author: Adnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-20 06:03:49

Jeśli używasz PHP 5.3 >, jest to zdecydowanie najdokładniejszy sposób obliczania różnicy:

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$diff = $later->diff($earlier)->format("%a");
 439
Author: Saksham Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 16:09:34

Od wersji PHP 5.3 i nowszych, nowe funkcje daty/czasu zostały dodane w celu uzyskania różnicy:

$datetime1 = new DateTime("2010-06-20");

$datetime2 = new DateTime("2011-06-22");

$difference = $datetime1->diff($datetime2);

echo 'Difference: '.$difference->y.' years, ' 
                   .$difference->m.' months, ' 
                   .$difference->d.' days';

print_r($difference);

Wynik jak poniżej:

Difference: 1 years, 0 months, 2 days

DateInterval Object
(
    [y] => 1
    [m] => 0
    [d] => 2
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 367
)
Mam nadzieję, że to pomoże !
 135
Author: Aditya P Bhatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-15 22:32:32

Konwertuj daty NA uniksowe znaczniki czasu, a następnie odejmuj jeden od drugiego. To da Ci różnicę w sekundach, którą dzielisz przez 86400 (ilość sekund w ciągu dnia), aby dać przybliżoną liczbę dni w tym zakresie.

Jeśli daty są w formacie 25.1.2010, 01/25/2010 lub 2010-01-25, możesz użyć funkcji strtotime:

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);

Używając ceil Zaokrągla liczbę dni do następnego pełnego dnia. Użyj floor zamiast tego, jeśli chcesz uzyskać ilość pełnych dni między tymi dwoma daty.

Jeśli Twoje daty są już w formacie znacznika czasu Uniksa, możesz pominąć konwersję i po prostu wykonać część $days_between. Aby uzyskać bardziej egzotyczne formaty dat, być może będziesz musiał wykonać niestandardowe parsowanie, aby to zrobić dobrze.

 121
Author: Tatu Ulmanen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-11 08:18:05

TL; DR do Nie używa uniksowych znaczników czasu. nie stosować time(). Jeśli to zrobisz, bądź przygotowany jeśli jego niezawodność 98,0825% cię zawiedzie. Użyj DateTime (lub Carbon).

Poprawna odpowiedź to Odpowiedź udzielona przez Sakshama Guptę (inne odpowiedzi również są poprawne):

$date1 = new DateTime('2010-07-06');
$date2 = new DateTime('2010-07-09');
$days  = $date2->diff($date1)->format('%a');

Lub proceduralnie jako jednoliterowy:

/**
 * Number of days between two dates.
 *
 * @param date $dt1    First date
 * @param date $dt2    Second date
 * @return int
 */
function daysBetween($dt1, $dt2) {
    return date_diff(
        date_create($dt2),  
        date_create($dt1)
    )->format('%a');
}

Jeśli naprawdę musisz używać uniksowych znaczników czasu, Ustaw strefę czasową na GMT, aby uniknąć większości pułapek szczegóły poniżej.


Długa odpowiedź: dlaczego dzielenie przez 24*60*60 (aka 86400) is unsafe

Większość odpowiedzi używających znaczników czasu Uniksa (i 86400 do konwersji na dni) zakłada dwa założenia, które razem mogą prowadzić do scenariuszy z błędnymi wynikami i subtelnymi błędami, które mogą być trudne do wyśledzenia i pojawiają się nawet dni, tygodnie lub miesiące po udanym wdrożeniu. Nie chodzi o to, że rozwiązanie nie działa - działa. Dzisiaj. Ale może przestać działać jutro.

Pierwszym błędem jest nie rozważanie tego, gdy zapytano: "ile dni minęło od wczoraj?", komputer może szczerze odpowiedzieć zero , Jeśli pomiędzy teraźniejszością a momentem wskazanym przez "wczoraj" mniej niż minął jeden cały dzień .

Zwykle podczas konwersji" dnia " na uniksowy znacznik czasu, otrzymywany jest znacznik czasu dlamidnight danego dnia.

Więc między 1 października a 15 października, minęło piętnaście dni. Jednak między 13:00 1 października a 14: 55 15 października, upłynęło piętnaście dni minus 5 minut, a większość rozwiązań wykorzystujących floor() lub dokonujących implicit integer conversion zgłosi jeden dzień mniej niż oczekiwano.

Więc, "ile dni temu było Y-m-d H: i: s"? daje złą odpowiedź .

Drugi błąd wynosi 86400 sekund. Jest to prawie zawsze prawda-zdarza się to wystarczająco często, aby przeoczyć ale odległość w sekundach między dwoma kolejnymi światłami wynosi z pewnością nie 86400 przynajmniej dwa razy w roku, gdy czas letni wchodzi w grę. Porównanie dwóch dat na granicy DST da błędną odpowiedź.

Więc nawet jeśli używasz "hack" wymuszania wszystkich znaczników czasu daty do ustalonej godziny, powiedzmy północ (jest to również robione domyślnie przez różne języki i frameworki, gdy określasz tylko dzień-miesiąc-rok, a nie także godzinę-minutę-sekundę; Happens z typem daty w bazach danych, takich jak MySQL), powszechnie używana formuła

 (unix_timestamp(DATE2) - unix_timestamp(DATE1)) / 86400

Lub

 floor(time() - strtotime($somedate)) / 86400

Zwróci, powiedzmy, 17, gdy DATE1 i DATE2 będą w tym samym segmencie DST roku; ale może zwrócić 17.042, a co gorsza, 16.958. Użycie floor () lub dowolnego niejawnego okrojenia do liczby całkowitej przekształci to, co powinno być 17 na 16. W innych okolicznościach wyrażenia takie jak "$days > 17 " zwrócą true dla 17.042, nawet jeśli oznacza to, że minęło 18 dni.

I rzeczy stają się jeszcze brzydsze, ponieważ taki kod nie jest przenośny na platformach, ponieważ

 59
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54