在 PHP 開發中,strtotime() 是處理日期時間最常用的函數之一。它的核心功能是將任何英文文本的日期時間描述解析為 Unix 時間戳(即自 1970 年 1 月 1 日 00:00:00 UTC 起的秒數)。這使得我們可以用極其自然的語言來進行複雜的日期運算,而無需手動計算秒數。
最簡單的用法是傳入一個標準的日期字符串:
echo strtotime("2009-1-22"); // 輸出: 1232553600
這返回 2009 年 1 月 22 日 00:00:00 的時間戳。配合 date() 函數即可格式化為可讀時間:
echo date("Y-m-d H:i:s", strtotime("2009-1-22")); // 2009-01-22 00:00:00
這個函數真正的威力在於支援相對時間描述。以下範例以 2009-01-22 09:40:25 為基準時間:
// 明天此時
echo date("Y-m-d H:i:s", strtotime("+1 day")); // 2009-01-23 09:40:25
// 昨天此時
echo date("Y-m-d H:i:s", strtotime("-1 day")); // 2009-01-21 09:40:25
// 下週此時
echo date("Y-m-d H:i:s", strtotime("+1 week")); // 2009-01-29 09:40:25
// 上週此時
echo date("Y-m-d H:i:s", strtotime("-1 week")); // 2009-01-15 09:40:25
// 下一個星期四(注意:返回該天 00:00:00)
echo date("Y-m-d H:i:s", strtotime("next Thursday")); // 2009-01-29 00:00:00
// 上一個星期四
echo date("Y-m-d H:i:s", strtotime("last Thursday")); // 2009-01-15 00:00:00
注意:
next和last指定具體星期幾時,返回的是該日期的 凌晨 00:00:00,而非保留當前時間部分。
strtotime() 支援極其豐富的組合,例如:
strtotime("first day of next month") — 下月第一天strtotime("last day of -1 month") — 上月最後一天strtotime("+3 days 10:00") — 三天後的上午 10 點strtotime("2024-12-25 18:30") — 精確到分秒的固定時間strtotime() 依賴 PHP 的預設時區設定(date_default_timezone_set() 或 php.ini 中的 date.timezone)。跨時區應用務必在腳本開頭明確設定時區。
// 危險:1 月 31 日 +1 month 會變成 3 月 3 日(因 2 月無 31 號)
echo date("Y-m-d", strtotime("2024-01-31 +1 month")); // 2024-03-02
// 安全:使用 "first day of" 或 "last day of"
echo date("Y-m-d", strtotime("last day of +1 month", strtotime("2024-01-31"))); // 2024-02-29
在 32 位系統上,整數最大值限制導致 strtotime() 無法處理 2038 年 1 月 19 日之後的日期。現代 64 位環境已無此限制,但若維護舊系統需注意。
strtotime() 是 PHP 日期時間處理的瑞士軍刀。掌握其「相對時間描述」語法,能讓複雜的業務邏輯(如:每月結算日、試用期到期、定時任務排程)用極簡潔的代碼實現。記得:永遠配合 date() 格式化輸出,並留意時區與月份邊界。