首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 計算兩個日期差值(年、月、日)函數實現

     編輯:PHP 相關知識

在會員天數、發帖間隔、日誌記錄等場景常需計算兩日期相差的「年、月、日」。本文提供一個精確處理月份長短、閏年邊界的函數。

函數代碼

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];
}

邏輯解析

  1. 統一時間順序:若開始日期大於結束日期,自動交換。
  2. 年月差:將年轉為月累加,再加月份差,得到總月數,再拆分為年、月。
  3. 日差:以結束日期的「年月」為基準,建立兩個時間戳:mktime(0,0,0, $m2, $d2, $y2) 與 mktime(0,0,0, $m2, $d1, $y2),相減得日差。此法自動處理每月天數不同。
  4. 負值借位:日差為負,說明結束日小於開始日,需向月份借位(減 1 月,加上月天數);月份為負則向年份借位。

使用範例

list($y, $m, $d) = DiffDate('2020-02-28', '2023-03-01');
echo "{$y}年 {$m}月 {$d}日"; // 輸出:3年 0月 1日

此函數適用於「滿歲」類計算,不包含時分秒精度。若需精確到秒,建議直接用時間戳差值換算。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved