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

PHP 實作 DateDiff 與 DateAdd 日期時間運算函數

     編輯:PHP 綜合知識

DateDiff - 計算兩日期時間差

/**
 * 計算兩個日期時間的差值
 * @param string $part  單位: y(年) m(月) w(週) d(天) h(時) n(分) s(秒)
 * @param string $begin 開始時間 (strtotime 可解析格式)
 * @param string $end   結束時間
 * @return float 差值
 */
function DateDiff($part, $begin, $end)
{
    $diff = strtotime($end) - strtotime($begin);
    switch (strtolower($part)) {
        case 'y': return bcdiv($diff, 60 * 60 * 24 * 365);
        case 'm': return bcdiv($diff, 60 * 60 * 24 * 30);
        case 'w': return bcdiv($diff, 60 * 60 * 24 * 7);
        case 'd': return bcdiv($diff, 60 * 60 * 24);
        case 'h': return bcdiv($diff, 60 * 60);
        case 'n': return bcdiv($diff, 60);
        case 's': return $diff;
        default:  return 0;
    }
}

DateAdd - 日期時間加減運算 (兩種實作)

實作一:拆解時間元件再組合

function DateAdd($part, $number, $date)
{
    $dt = getdate(strtotime($date));
    $h = $dt['hours']; $i = $dt['minutes']; $s = $dt['seconds'];
    $m = $dt['mon'];   $d = $dt['mday'];   $y = $dt['year'];

    switch (strtolower($part)) {
        case 'y': $y += $number; break;
        case 'q': $m += $number * 3; break;  // 季
        case 'm': $m += $number; break;
        case 'w': $d += $number * 7; break;
        case 'd': $d += $number; break;
        case 'h': $h += $number; break;
        case 'n': $i += $number; break;
        case 's': $s += $number; break;
    }
    return date('Y-m-d H:i:s', mktime($h, $i, $s, $m, $d, $y));
}

實作二:使用 strtotime 相對時間格式 (推薦,更簡潔)

function DateAdd($part, $number, $date)
{
    $unitMap = [
        'y' => 'year', 'm' => 'month', 'w' => 'week', 'd' => 'day',
        'h' => 'hour', 'n' => 'minute', 's' => 'second', 'q' => 'month'
    ];
    $unit = $unitMap[strtolower($part)] ?? 'day';
    $multiplier = (strtolower($part) === 'q') ? 3 : 1;
    return date('Y-m-d H:i:s', strtotime($date . " +" . ($number * $multiplier) . " $unit"));
}

使用範例

$start = '2024-01-01 12:00:00';
$end   = '2024-12-31 12:00:00';

echo "相差天數: " . DateDiff('d', $start, $end) . "\n";  // 365
echo "相差月數: " . DateDiff('m', $start, $end) . "\n";  // 12

echo "一年後: " . DateAdd('y', 1, $start) . "\n";       // 2025-01-01 12:00:00
echo "三個月後: " . DateAdd('m', 3, $start) . "\n";      // 2024-04-01 12:00:00
echo "兩週後: " . DateAdd('w', 2, $start) . "\n";        // 2024-01-15 12:00:00
echo "10 天前: " . DateAdd('d', -10, $start) . "\n";     // 2023-12-22 12:00:00

現代替代方案:DateTime 類別 (PHP 5.2+)

$dt1 = new DateTime('2024-01-01');
$dt2 = new DateTime('2024-12-31');
$diff = $dt1->diff($dt2);
echo $diff->days;           // 總天數
echo $diff->format('%m月 %d天'); // 月數+天數

$dt1->add(new DateInterval('P1Y2M10D')); // 加 1年2月10天
$dt1->sub(new DateInterval('P3D'));      // 減 3天
echo $dt1->format('Y-m-d');

建議: 新專案優先使用內建 DateTime / DateInterval / DatePeriod,功能更完整、支援時區、閏年計算更精確。

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