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

PHP 字符串日期比較:strtotime + mktime 統一轉時間戳再比較

     編輯:PHP 相關知識

PHP 字符串日期比較:strtotime + mktime 統一轉時間戳再比較

直接比較日期字符串 (如 '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 vs DateTime

特性strtotimeDateTime::createFromFormat
格式靈活度高 (相對時間、自然語言)需指定格式
嚴格驗證弱 (錯誤格式可能返回 false 或錯誤時間)強
效能快稍慢
時區處理使用默認時區可指定時區

最佳實踐

  1. 用戶輸入日期:DateTime::createFromFormat('Y-m-d', $input) 嚴格驗證格式
  2. 內部比較/存儲:統一轉 DateTimeImmutable 或時間戳整數
  3. 資料庫:使用 DATE/DATETIME 類型,避免字符串存儲
  4. 跨時區應用:所有時間戳存 UTC,展示時轉換用戶時區

避坑:strtotime 陷阱

strtotime('2024-02-31'); // false (無效日期)
strtotime('next monday'); // 相對時間,依賴當前時間
strtotime('01/02/2024'); // 模糊:美式 1月2日 還是 歐式 2月1日?
// 結論:輸入務必標準化為 Y-m-d H:i:s 或使用 DateTime 指定格式
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved