2011-03-22 15 views
21

Potrzebuję uzyskać liczbę lat z 2 podanych dat. Oto mój kod:Obliczanie liczby lat między 2 datami w PHP

function daysDifference($endDate, $beginDate) 
{ 
    $date_parts1=explode("-", $beginDate); 
    $date_parts2=explode("-", $endDate); 

    $start_date=gregoriantojd($date_parts1[1], $date_parts1[2], $date_parts1[0]); 
    $end_date=gregoriantojd($date_parts2[1], $date_parts2[2], $date_parts2[0]); 
    $diff = $end_date - $start_date; 
    echo $diff; 
    $years = floor($diff/(365.25*60*60*24)); 
    return $years; 
} 

echo daysDifference('2011-03-12','2008-03-09'); 

Numer $diff podaje wynik liczbowy. Po powrocie $years otrzymuję 0. Co zrobiłem źle?

+0

Proszę wyszukać przed wysłaniem. [Jak obliczyć różnicę między dwiema datami używając PHP?] (Http://stackoverflow.com/questions/676824/how-to-calculate-the-difference-between-two-dates-using-php) –

+0

@Hans: Dzięki Hans – Deepak

+0

Możesz chcieć wyjaśnić, czego szukasz. Twoja funkcja nazywa się 'daysDifference' i zwraca' $ years' i używa 'gregoriantojd'. – Matthew

Odpowiedz

-2

Jeśli chcesz liczbę lat między dwiema datami, dlaczego nie wystarczy użyć następujących czynności:

function yearsDifference($endDate, $beginDate) 
{ 
    $date_parts1=explode("-", $beginDate); 
    $date_parts2=explode("-", $endDate); 
    return $date_parts2[0] - $date_parts1[0]; 
} 

echo yearsDifference('2011-03-12','2008-03-09'); 

, który w tym przypadku będzie Ci:

3 
+0

chce różnicy w dniu juliańskim – diEcho

+0

Może to nie dać zamierzonego rezultatu. Co powiesz na 31 grudnia w porównaniu z 1 stycznia? Nie sądzę, że powinien to być pełny rok, ale zależy to od kontekstu. – Matthew

+0

Ten zwróci tylko różnicę między numerami roku. To jest mylące. – Aistis

81
$d1 = new DateTime('2011-03-12'); 
$d2 = new DateTime('2008-03-09'); 

$diff = $d2->diff($d1); 

echo $diff->y; 
+2

+1 za korzystanie z DateTime. – Jacob

+2

Taa, ta powinna być zalecana. – Aistis

0

się Wartość $ start_date i $ end_date 'to liczba dni, a nie sekund. więc nie powinieneś dzielić $ diff z 365,25 * 60 * 60 * 24.

function daysDifference($endDate, $beginDate) 
{ 

    $date_parts1 = explode("-", $beginDate); 
    $date_parts2 = explode("-", $endDate); 
    $start_date = gregoriantojd($date_parts1[1], $date_parts1[2], $date_parts1[0]); 
    $end_date = gregoriantojd($date_parts2[1], $date_parts2[2], $date_parts2[0]); 
    $diff = abs($end_date - $start_date); 
    $years = floor($diff/365.25); 
    return $years; 
} 

echo daysDifference('2011-03-12','2008-03-09'); 
1

Guys herezje dobry kod i używałem ..... to nie jest mój pomysł .... Właśnie to niektóre skąd siatki ...

mieć również różnorodne opcji nadzieję, że to pomoże .........

function datediff($interval, $datefrom, $dateto, $using_timestamps = false) { 
    /* 
    $interval can be: 
    yyyy - Number of full years 
    q - Number of full quarters 
    m - Number of full months 
    y - Difference between day numbers 
     (eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".) 
    d - Number of full days 
    w - Number of full weekdays 
    ww - Number of full weeks 
    h - Number of full hours 
    n - Number of full minutes 
    s - Number of full seconds (default) 
    */ 

    if (!$using_timestamps) { 
     $datefrom = strtotime($datefrom, 0); 
     $dateto = strtotime($dateto, 0); 
    } 
    $difference = $dateto - $datefrom; // Difference in seconds 

    switch($interval) { 

    case 'yyyy': // Number of full years 

     $years_difference = floor($difference/31536000); 
     if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) { 
      $years_difference--; 
     } 
     if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) { 
      $years_difference++; 
     } 
     $datediff = $years_difference; 
     break; 

    case "q": // Number of full quarters 

     $quarters_difference = floor($difference/8035200); 
     while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) { 
      $months_difference++; 
     } 
     $quarters_difference--; 
     $datediff = $quarters_difference; 
     break; 

    case "m": // Number of full months 

     $months_difference = floor($difference/2678400); 
     while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) { 
      $months_difference++; 
     } 
     $months_difference--; 
     $datediff = $months_difference; 
     break; 

    case 'y': // Difference between day numbers 

     $datediff = date("z", $dateto) - date("z", $datefrom); 
     break; 

    case "d": // Number of full days 

     $datediff = floor($difference/86400); 
     break; 

    case "w": // Number of full weekdays 

     $days_difference = floor($difference/86400); 
     $weeks_difference = floor($days_difference/7); // Complete weeks 
     $first_day = date("w", $datefrom); 
     $days_remainder = floor($days_difference % 7); 
     $odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder? 
     if ($odd_days > 7) { // Sunday 
      $days_remainder--; 
     } 
     if ($odd_days > 6) { // Saturday 
      $days_remainder--; 
     } 
     $datediff = ($weeks_difference * 5) + $days_remainder; 
     break; 

    case "ww": // Number of full weeks 

     $datediff = floor($difference/604800); 
     break; 

    case "h": // Number of full hours 

     $datediff = floor($difference/3600); 
     break; 

    case "n": // Number of full minutes 

     $datediff = floor($difference/60); 
     break; 

    default: // Number of full seconds (default) 

     $datediff = $difference; 
     break; 
    }  

    return $datediff; 

} 

echo datediff('yyyy','2009-01-16','2011-03-16'); 
3

na polu 5.2 PHP (tak naprawdę, nadal istnieje), więc bez DateTime :: diff() wsparcie skończyło się przy użyciu to:

$dateString='10-05-1975'; 
$years = round((time()-strtotime($dateString))/(3600*24*365.25)) 
-1
<?php 

$date1=date_create("1992-02-22");  

$date2=date_create("2016-09-24");  

$diff=date_diff($date1,$date2);  

echo $diff->y;  

?> 

Myślę, że ta jest najlepszą odpowiedzią, z jakiej kiedykolwiek korzystałem.

Dziękujemy

Powiązane problemy