/**
* 計算兩個日期時間的差值
* @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;
}
}
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));
}
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
$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,功能更完整、支援時區、閏年計算更精確。