[英]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.