在會員天數、發帖間隔、日誌記錄等場景常需計算兩日期相差的「年、月、日」。本文提供一個精確處理月份長短、閏年邊界的函數。
function DiffDate($date1, $date2) {
// 確保 $date1 ≤ $date2
if (strtotime($date1) > strtotime($date2)) {
list($date1, $date2) = [$date2, $date1];
}
list($y1, $m1, $d1) = explode('-', $date1);
list($y2, $m2, $d2) = explode('-', $date2);
// 總月份差
$totalMonths = ($y2 - $y1) * 12 + $m2 - $m1;
$years = intval($totalMonths / 12);
$months = $totalMonths % 12;
// 計算日差:以 $date2 的年月為基準,比較兩日期的「日」
$dayDiff = (mktime(0,0,0, $m2, $d2, $y2) - mktime(0,0,0, $m2, $d1, $y2)) / 86400;
// 跨月借位處理
if ($dayDiff < 0) {
$months -= 1;
$dayDiff += date('j', mktime(0,0,0, $m2, 0, $y2)); // 上月天數
}
if ($months < 0) {
$years -= 1;
$months += 12;
}
return [$years, $months, $dayDiff];
}
mktime(0,0,0, $m2, $d2, $y2) 與 mktime(0,0,0, $m2, $d1, $y2),相減得日差。此法自動處理每月天數不同。list($y, $m, $d) = DiffDate('2020-02-28', '2023-03-01');
echo "{$y}年 {$m}月 {$d}日"; // 輸出:3年 0月 1日
此函數適用於「滿歲」類計算,不包含時分秒精度。若需精確到秒,建議直接用時間戳差值換算。