簡體   English   中英

如何正確計算2個日期之間的差異php

[英]How to calculate the difference between 2 dates properly php

我正在嘗試計算php項目的2個日期之間的差異。

例如:4月2日與6月1日之間有什么區別?

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

計算差異的第二種方法
我們算為1個月。 然后加上從4月2日到30日的天數(28天)和從6月的天數(1天)=> 1個月零29天。

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

所以起初我嘗試使用DateTime :: 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-02-03”和“ 2015-04-02”之間的差額應為1個月和30天 ,(02-03到03-03 = 1個月。然后我們將剩下的日子計算為04-02 ,即30), diff計算得出的結果是1個月27天 (我想它是通過上述第二種方法計算出的差異)。 因此,它要么計算錯誤,要么第二種方法是正確的計算方法。

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

此外,2015-05-01和2015-02-28之間的差應為2個月零1天 ,但diff函數返回2個月零3天

那么,哪種方法才是計算2個日期之間的差異的正確方法? DateTime :: diff()是否正確計算? 並且有一種方法可以通過第一種方法計算兩個日期之間的差異。

php的DateInterval有錯誤。 現在,您可以嘗試使用Moment庫之類的外部實現,或者跟蹤錯誤狀態並等待其修復。

這樣可以正確計算出差異。

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

}

這是一個小例子,希望對您有所幫助

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM