2015-11-09 233 views
1

我想要計算一個php項目的兩個日期之間的差異。如何計算兩個日期之間的差異正確php

例如: 是什麼六月的4月1日的第2次之間的區別?

計算至5 = 1個月第2個從4月2日的差
的第一方法。從5月2日到6月1日= 30天。 =>四月2日到6月1號= 1個月和30天

計算差值
的第二種方法,我們計數可爲1個月。然後添加4月2日至30日(28日)以及6月(1日)的日期=> 1個月和29天。

我認爲第一種方法是正確的,只是因爲我想大多數人的計算這種方式。

所以剛開始我試圖用日期時間:: DIFF()函數

function dateDiff($date1, $date2 = false) { 
if (!$date2) 
    $date2 = date('Y-m-d'); 

$datetime1 = new DateTime($date1 , new DateTimeZone('EUROPE/Sofia')); 
$datetime2 = new DateTime($date2 , new DateTimeZone('EUROPE/Sofia')); 

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

$y = $interval->format('%y'); 
$m = $interval->format('%m'); 
$d = $interval->format('%d'); 

return $y . " " . $m . " " . $d; 

} 

但我注意到它沒有正確計算的差異。 「2015年2月3日」之間的差異,「2015年4月2日」應該是1個月和30天,(02-03至03-03 = 1個月。然後我們計算的天休息04-02,它們是30),BUT的差異計算出它作爲1個月和27天(I估計是計算由我上述的第二方法中的差異)。因此它要麼計算錯誤,要麼第二種方法是正確的計算方法。

但是 讓我們來看看這個例子: 2015-05-01和2015-03-31(這次我們倒退了)。差異返回1個月區別,我認爲應該是1個月和1天

而且2015年5月1日和2015年2月28日之間的差異應該是2個月1天,但DIFF函數返回2個月3天

那麼,哪個是計算兩個日期差異的正確方法呢? DateTime :: diff()是否正確計算?有沒有辦法通過第一種方法計算兩個日期之間的差異。

+1

https://github.com/fightbulc/moment.php –

回答

0

這應該正確地計算出的差異。

function monthDiff($m1, $m2) { 
    if($m1 > $m2) { 
     return 12 - $m1 + $m2; 
    } 
    return $m2 - $m1; 
} 

function yearDiff($y1, $y2) { 
    return $y2 - $y1; 
} 


function checkLeapYear($year){ 
    $year = (int)$year; 
    return ((($year % 4 == 0 && ($year % 100) != 0) || (($year % 100) == 0 && ($year % 400) == 0)) ? 1 : 0); 
} 


function dateDiff($date1, $date2 = false) { 
    if (!$date2) 
     $date2 = date('Y-m-d'); 

    $datetime1 = new DateTime($date1 , new DateTimeZone('EUROPE/Sofia')); 
    $datetime2 = new DateTime($date2 , new DateTimeZone('EUROPE/Sofia')); 

    if($datetime1 > $datetime2){ //always go from smaller to bigger date 
     $temp = $datetime1; 
     $datetime1 = $datetime2; 
     $datetime2 = $temp; 
    } 

    $d1 = (int)$datetime1->format('d'); 
    $d2 = (int)$datetime2->format('d'); 

    $m1 = (int)$datetime1->format('m'); 
    $m2 = (int)$datetime2->format('m'); 

    $y1 = (int)$datetime1->format('Y'); 
    $y2 = (int)$datetime2->format('Y'); 


    $leapYear = checkLeapYear($y1); 
    $daysInMonth1 = [1 => 31, 28 + $leapYear, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // the number of days in the months 

    $leapYear = checkLeapYear($y2); 
    $daysInMonth2 = [1 => 31, 28 + $leapYear, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 


    $monthCorrection = 0; 


    if ($d1 < $d2) { 
     $d = $d2 - $d1; 
    } 

    if ($d1 > $d2){ 
     if ($daysInMonth2[$m2] >= $d1){ 
      $d = $daysInMonth1[$m1] - $d1 + $d2;; 
     } 
     else { 
      $d = $daysInMonth1[$m1] - $d1 + $d2; 
     } 
     $monthCorrection = -1; 
    } 

    if ($d1 == $d2){ 
     $d = 0; 
    } 

    $m = monthDiff($m1, $m2) + $monthCorrection; 

    $y = yearDiff($y1, $y2); 
    if ($m1 > $m2){ 
     $y--; 
    } 

    return $y . " years " . $m . " months " . $d . " days"; 

} 
0

Php與DateInterval有bug。現在您可以嘗試使用外部實現,如Moment庫,或者關注錯誤狀態並等待它修復。

-2

這裏是一個小例子,希望它有助於

$date1 = strtotime("2015-01-01"); //yyyy-mm-dd 
$date2 = strtotime("2015-01-08"); 
$datediff = $date2 - $date1; 
echo floor($datediff/(60*60*24)); 
相關問題