數據庫將年、月、日分別存儲為整數(如 Y=2020, M=1, D=1),需與當前日期比較,判斷是否過期並計算天數差。
// 直接拼接字符串相減,會當作數字運算導致錯誤
$daydiff = date("$nowyr$nowmon$nowdt") - date("Ymd"); // 202011 - 20090305 = 負數且無意義
<?php
$nowyr = 2020; $nowmon = 1; $nowdt = 1;
// 組合為標準日期字符串
$target_date = sprintf("%04d-%02d-%02d", $nowyr, $nowmon, $nowdt);
$diff_seconds = strtotime($target_date) - time(); // 與當前時間戳差值(秒)
$daydiff = floor($diff_seconds / 86400); // 轉換為天數
if ($daydiff > 0) {
echo "距離目標日期還有 $daydiff 天";
} elseif ($daydiff < 0) {
echo "目標日期已過 " . abs($daydiff) . " 天";
} else {
echo "今天就是目標日期";
}
?>
<?php
$target = new DateTime(sprintf("%04d-%02d-%02d", $nowyr, $nowmon, $nowdt));
$now = new DateTime(); // 當前時間
$interval = $target->diff($now); // 返回 DateInterval 對象
$days = (int)$interval->format('%r%a'); // 帶符號的總天數
echo "相差 $days 天"; // 正數表示未來,負數表示過去
// 更多屬性:$interval->y (年), $interval->m (月), $interval->d (日)
?>
DATE、DATETIME 或 TIMESTAMP 類型存儲完整日期,避免拆分年月日。STR_TO_DATE(CONCAT(year,'-',month,'-',day), '%Y-%m-%d')。WHERE exp_date < CURDATE()),減少數據傳輸與應用層計算。日期運算務必轉換為時間戳或 DateTime 對象,切勿對格式化字符串或拼接數字直接做數學運算。PHP 5.3+ 環境首選 DateTime,代碼更清晰、時區處理更可靠。