2013-04-01 27 views
7

Mam następujący kod:PHP Data różnica

$dStart = new DateTime('2013-03-15'); 
$dEnd = new DateTime('2013-04-01'); 
$dDiff = $dStart->diff($dEnd); 
echo $dDiff->days; 

nie wiem dlaczego ja dostaję 6015 jako wynik.

+0

Co się dzieje, jeśli przesunięcie terminu o jeden? Spróbuj na przykład "2013-03-16" i "2013-04-02". – cwallenpoole

+0

Jeśli ustawię 2013-03-16 i 2013-04-02 otrzymam tę samą wartość 6015 – carlosduarte

+2

Znalazłem raport o błędzie # 51184 https://bugs.php.net/bug.php?id=51184 – carlosduarte

Odpowiedz

4

Spróbuj jak

$dStart = strtotime('2013-03-15'); 
$dEnd = strtotime('2013-04-01'); 
$dDiff = $dEnd - $dStart; 
echo date('H:i:s',$dDiff); 

lub jak na kodzie spróbuj

$dDiff = $dStart->diff($dEnd); 
$date->format('d',$dDiff); 
echo $dDiff->days; 

jeśli chcesz diff w dniach spróbować z tym również

echo floor($dDiff/(60*60*24)); 
+0

To powraca "01:01:00" Spodziewam się, że dostanę różnicę w dniach między 2 datami – carlosduarte

+1

spróbuj edytować .. ?? plz – Gautam3164

+0

Masz to ... @ carlosduarte .. ?? – Gautam3164

3

Spróbuj this-

$dStart = new DateTime('2013-03-15'); 
$dEnd = new DateTime('2013-04-01'); 
$dDiff = $dStart->diff($dEnd); 
echo $dDiff->format('%d days') 

Sprawdź PHP

Proszę sprawdzić demo link

+0

Powraca +6015 dni również musi być błędem wersji PHP – carlosduarte

+0

@ carlosduarte: zaktualizowany post i dodany link do phpfiddle: http://phpfiddle.org/main/code/7dq-mb7 –

+0

W tym przykładzie dodajesz dowolną datę ...Powiedzmy, że zmienimy to na 2015, to powraca 17 dni zawsze – utkarshk

1

użycie tego

$datetime1 = date_create('2013-03-15'); 
$datetime2 = date_create('2013-04-01'); 
$interval = date_diff($datetime1, $datetime2); 
echo $interval->format('%R%a days'); 
+0

Powraca +6015 dni może być błędem php? Wersja PHP 5.3.1 – carlosduarte

+0

może być powracającym błędem dla twojej wersji php. Testowałem i wróciłem +17 dni. –

+0

Nie mogę zrozumieć, co się dzieje z PHP, czy echo (1363305600 - 1364857200)/(60 * 60 * 24) zwraca -A.9583333333333 – carlosduarte

1

Wolę coś takiego:

function days_diff($first_date, $second_date) 
{ 
    $later = new DateTime($second_date); 
    $then = new DateTime($first_date); 
    return $later->diff($then)->format('a'); 
} 
+0

Tak, jest to jedyne rozwiązanie, które działa w PHP w wersji 5.3.1 – carlosduarte

+1

To nie zadziała, jeśli różnica będzie większa niż 1 miesiąc. DateInterval przewróci się i zwiększy "m", resetując 'd' z powrotem do 0. Obecnie, musisz użyć' $ interval-> format ('a') ', aby uzyskać całkowitą liczbę dni między dwoma dniami (jeśli spodziewasz się zakres kiedykolwiek powyżej 1 miesiąca) –

+0

@ColinMorelli Dzięki! Zastosowałem zmianę. Używałem tej funkcji bez problemu, ale moja sprawa była zawsze w ciągu miesiąca. –

0

mam te same 6015 dni na PHP 5.3.0 i znalazł rozwiązanie z wykorzystaniem var_dump(). Mój dokładny kod jest tutaj:

$timestring = "Thu, 13 Jun 2013 14:05:59 GMT"; 
date_default_timezone_set('GMT'); 
$date = DateTime::createFromFormat('D, d M Y G:i:s T', $timeString); 
$nowdate = new DateTime("now"); 
$interval = $date->diff($nowdate); 

Teraz gdybym zrobić var_dump($interval), wynik jest:

object(DateInterval)#5 (8) { 
    ["y"]=> 
    int(0) 
    ["m"]=> 
    int(0) 
    ["d"]=> 
    int(0) 
    ["h"]=> 
    int(19) 
    ["i"]=> 
    int(45) 
    ["s"]=> 
    int(33) 
    ["invert"]=> 
    int(0) 
    ["days"]=> 
    int(6015) 
} 

Więc godzin (h), mikroskopy (i) i sekundy (s) są ustawione poprawnie, ale jest jeszcze inna właściwość days, która pozostaje stała przy 6015 i to jest to, co inni robią jako błąd. Cóż, nie mogę zrozumieć, skąd bierze się ta wartość. Ponownie, zgodnie z instrukcją PHP dla DateInterval pod http://www.php.net/manual/en/class.dateinterval.php, próbowałem uzyskać dostęp do nich jako właściwości obiektu i wszystko poszło absolutnie dobrze.

Stąd uzyskać dokładny wynik przez:

echo (string) $interval->d." days ago";