| 函數 | 用途 | 典型場景 |
|---|---|---|
checkdate($m, $d, $y) | 驗證日期合法性 | 表單提交前校閱 |
getdate($ts) | 時間戳 → 關聯數組 | 拆解年月日時分秒 |
mktime($h,$i,$s,$m,$d,$y) | 日期組件 → 時間戳 | 構建特定時間點 |
date($fmt, $ts) | 時間戳 → 格式化字符串 | 顯示、日誌、文件名 |
strtotime($str) | 自然語言 → 時間戳 | 相對時間計算(+1 week) |
strftime($fmt, $ts) | 本地化格式化 | 多語言月份/星期顯示 |
microtime($get_as_float) | 微秒級時間戳 | 性能分析、唯一標譤 |
gmmktime() / gmdate() | GMT/UTC 時間操作 | 跨時區系統、API 交互 |
date_default_timezone_set() | 設置腳本默認時區 | 項目入口統一配置 |
checkdate + 異常處理function validateDate($m, $d, $y) {
if (!checkdate($m, $d, $y)) {
throw new InvalidArgumentException("無效日期: $y-$m-$d");
}
return true;
}
strtotime 陷阱與替代// 常見陷阱:月份邊界
echo date('Y-m-d', strtotime('2023-01-31 +1 month')); // 2023-03-03 ❌
// 推薦:DateTime 不可變對象 (PHP 5.5+)
$dt = new DateTimeImmutable('2023-01-31');
echo $dt->modify('+1 month')->format('Y-m-d'); // 2023-02-28 ✅
// 或使用 date_create + date_add
$dt = date_create('2023-01-31');
date_add($dt, date_interval_create_from_date_string('1 month'));
echo date_format($dt, 'Y-m-d');
const LOG_FMT = 'Y-m-d H:i:s.u'; // 含微秒
echo date(LOG_FMT, microtime(true));
// bootstrap.php / config/app.php
date_default_timezone_set('Asia/Shanghai'); // 或 UTC
// 數據庫存儲統一 UTC,顯示層按用戶時區轉換
$userTz = new DateTimeZone('America/New_York');
$dt = new DateTime('2023-10-01 12:00:00', new DateTimeZone('UTC'));
$dt->setTimezone($userTz);
echo $dt->format('Y-m-d H:i:s T'); // 2023-10-01 08:00:00 EDT
microtime(true) 替代 microtime() 字符串解析$start = microtime(true);
// ... code ...
$elapsed = microtime(true) - $start;
printf("耗時: %.4f 秒", $elapsed);
setlocale + strftime 注意事項
// Linux 通常需要安裝語言包:apt-get install language-pack-zh-hans
setlocale(LC_TIME, 'zh_CN.utf8', 'Chinese_China.936'); // 兼容 Win/Linux
echo strftime('%Y年%B%d日 %A'); // 2023年十月01日 星期日
避坑:Windows 下 locale 名稱不同;線程不安全(PHP-FPM 多進程無影響,CLI 多線程需注意)。
DateTime / DateTimeImmutable / DateInterval / DatePerioddate_default_timezone_set 污染。DatePeriod 輕鬆實現定時任務、日曆生成:new DatePeriod($start, $interval, $end)。PHP 日期時間處理歷經 date() 時代 → DateTime 時代 → DateTimeImmutable 時代。新項目請直接使用不可變對象體系,舊代碼逐步重構。時區策略:「存 UTC、顯本地、算不可變」是分布式系統的黃金法則。