直接比較日期字符串 (如 '2024-01-15' > '2024-02-01') 靠字典序不可靠。標準做法:解析為 Unix 時間戳 (整數) 再比較。
function compareDateStrings(string $date1, string $date2): int {
// 返回 1: date1 > date2, 0: 相等, -1: date1 < date2
$ts1 = strtotime($date1);
$ts2 = strtotime($date2);
if ($ts1 === false || $ts2 === false) throw new InvalidArgumentException('無效日期格式');
return $ts1 <=> $ts2; // PHP 7+ 太空船運算符
}
// 使用
$d1 = '2024-12-31';
$d2 = '2025-01-01';
echo compareDateStrings($d1, $d2); // -1 (d1 早於 d2)
function isDatePast(string $date): bool {
$ts = strtotime($date);
$now = time(); // 或 strtotime('today') 忽略時間部分
return $ts < $now;
}
// 搜索場景:用戶輸入結束日期不能早於今天
if (isDatePast($_POST['end_date'])) {
throw new Exception('結束日期不能早於今天');
}
| 特性 | strtotime | DateTime::createFromFormat |
|---|---|---|
| 格式靈活度 | 高 (相對時間、自然語言) | 需指定格式 |
| 嚴格驗證 | 弱 (錯誤格式可能返回 false 或錯誤時間) | 強 |
| 效能 | 快 | 稍慢 |
| 時區處理 | 使用默認時區 | 可指定時區 |
DateTime::createFromFormat('Y-m-d', $input) 嚴格驗證格式DateTimeImmutable 或時間戳整數DATE/DATETIME 類型,避免字符串存儲strtotime('2024-02-31'); // false (無效日期)
strtotime('next monday'); // 相對時間,依賴當前時間
strtotime('01/02/2024'); // 模糊:美式 1月2日 還是 歐式 2月1日?
// 結論:輸入務必標準化為 Y-m-d H:i:s 或使用 DateTime 指定格式