2011-03-22 49 views
21

Tôi cần lấy số năm từ 2 ngày được cung cấp. Đây là mã của tôi:Tính số năm giữa 2 ngày trong 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'); 

$diff cho đầu ra số. Khi tôi trả lại $years, đang nhận được 0. Tôi đã làm gì sai?

+0

Vui lòng tìm kiếm trước khi đăng. [Làm thế nào để tính toán sự khác biệt giữa hai ngày sử dụng PHP?] (Http://stackoverflow.com/questions/676824/how-to-calculate-the-difference-between-two-dates-using-php) –

+0

@Hans: Cảm ơn Hans – Deepak

+0

Bạn có thể muốn làm rõ những gì bạn đang tìm kiếm. Hàm của bạn có tên 'daysDifference' và trả về' $ years' và sử dụng 'gregoriantojd'. – Matthew

Trả lời

-2

Nếu bạn muốn số năm giữa hai ngày, tại sao không chỉ cần sử dụng như sau:

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'); 

nào, trong trường hợp này, sẽ giúp bạn có được:

3 
+0

anh ta muốn sự khác biệt trong Julian Day – diEcho

+0

Điều này có thể không đưa ra kết quả mong muốn. Điều gì về ngày 31 tháng 12 và ngày 1 tháng 1? Tôi không nghĩ đó là một năm trọn vẹn, nhưng nó phụ thuộc vào ngữ cảnh. – Matthew

+0

Điều này sẽ chỉ trả lại sự khác biệt giữa các số năm. Nó là sai lầm. – Aistis

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

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

echo $diff->y; 
+2

+1 để sử dụng DateTime. – Jacob

+2

Vâng, đây là một trong những đề nghị. – Aistis

0

sự Giá trị $ start_date và $ end_date 'là số ngày, không phải là số giây. vì vậy bạn không nên chia $ diff với 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 heres một mã tốt tôi sử dụng để sử dụng ..... nó không ý tưởng của tôi .... tôi chỉ có nó một số nơi từ net ...

Nó cũng có nhiều lựa chọn hy vọng điều này sẽ giúp .........

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

Trên một PHP 5.2 hộp (yeah thực sự, họ vẫn tồn tại) như vậy mà không DateTime :: diff() hỗ trợ tôi đã kết thúc sử dụng này:

$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;  

?> 

Tôi nghĩ câu trả lời này là câu trả lời hay nhất mà tôi từng sử dụng.

Cảm ơn bạn

Các vấn đề liên quan