PHP 日期運算不如 SQL Server 直觀(如 DATEADD(month, 3, GETDATE()))。本文提供兩個函數模擬 dateadd、datediff,輸入均為 Unix timestamp。
function dateadd($part, $n, $datetime) {
$year = date("Y", $datetime);
$month = date("m", $datetime);
$day = date("d", $datetime);
$hour = date("H", $datetime);
$min = date("i", $datetime);
$sec = date("s", $datetime);
switch (strtolower($part)) {
case "year": $year += $n; break;
case "month": $month += $n; break;
case "day": $day += $n; break;
case "hour": $hour += $n; break;
case "min": $min += $n; break;
case "sec": $sec += $n; break;
default: return 0;
}
return mktime($hour, $min, $sec, $month, $day, $year);
}
function datediff($part, $date1, $date2) {
$y1 = date("Y", $date1); $y2 = date("Y", $date2);
$m1 = date("m", $date1); $m2 = date("m", $date2);
$d1 = date("d", $date1); $d2 = date("d", $date2);
$h1 = date("H", $date1); $h2 = date("H", $date2);
$i1 = date("i", $date1); $i2 = date("i", $date2);
$s1 = date("s", $date1); $s2 = date("s", $date2);
switch (strtolower($part)) {
case "year": return $y2 - $y1;
case "month": return ($y2 - $y1) * 12 + $m2 - $m1;
case "day": return (mktime(0,0,0,$m2,$d2,$y2) - mktime(0,0,0,$m1,$d1,$y1)) / 86400;
case "hour": return (mktime($h2,0,0,$m2,$d2,$y2) - mktime($h1,0,0,$m1,$d1,$y1)) / 3600;
case "min": return (mktime($h2,$i2,0,$m2,$d2,$y2) - mktime($h1,$i1,0,$m1,$d1,$y1)) / 60;
case "sec": return $date2 - $date1;
default: return 0;
}
}
$today = mktime(0,0,0, date("m"), date("d"), date("Y"));
$threeMonthsLater = dateadd("month", 3, $today);
$diffDays = datediff("day", $today, $threeMonthsLater); // 約 90~92
PHP 5.3+ 推薦使用 DateTime + DateInterval + DatePeriod 物件導向 API,功能更強、時區處理更正確。