PHP 日期時間核心函式:從時間戳到格式化輸出的完整指南
日期時間處理是 PHP 開發的高頻需求。本文整理 time()、date()、時區設定、時間戳轉換等核心函式用法,並補充實務常見坑點與最佳實踐。
一、取得當前時間戳
echo time(); // 例:1705315200(自 1970-01-01 00:00:00 UTC 起的秒數)
注意:time() 回傳整數秒,非毫秒。若需毫秒,用 microtime(true)。
二、格式化輸出日期時間
echo date('Y-m-d H:i:s'); // 2024-01-15 14:30:45
常用格式字元
| 字元 | 說明 | 範例 |
| Y | 四位數年份 | 2024 |
| m | 兩位數月份 | 01 |
| d | 兩位數日期 | 15 |
| H | 24 小時制小時 | 14 |
| i | 分鐘 | 30 |
| s | 秒 | 45 |
| w | 星期(0=週日) | 1 |
| W | 年度第幾週 | 03 |
| t | 當月總天數 | 31 |
三、時區處理:避免「時間對不上」
3.1 取得當前預設時區
echo date_default_timezone_get(); // 輸出如 UTC、Asia/Shanghai
3.2 設定預設時區(建議在 bootstrap 階段統一設定)
date_default_timezone_set('Asia/Shanghai'); // 設為中國標準時間(UTC+8)
echo date('Y-m-d H:i:s'); // 現在會顯示正確的本地時間
最佳實踐:在 php.ini 設定 date.timezone = Asia/Shanghai,或在框架啟動檔(如 index.php、config/main.php)統一呼叫 date_default_timezone_set(),避免分散在各處造成不一致。
四、時間戳 ↔ 日期字串互轉
4.1 時間戳 → 格式化日期
$ts = time();
echo date('Y-m-d H:i:s', $ts); // 指定時間戳
echo date('Y-m-d H:i:s', strtotime('+1 day')); // 相對時間
4.2 日期字串 → 時間戳
$ts = strtotime('2024-01-15 14:30:45');
$ts = strtotime('next Monday');
$ts = strtotime('first day of this month');
strtotime() 解析英文文字日期描述,極其強大但需注意:
- 輸入格式不明確時可能產生歧義(如
01/02/2024 美式/英式不同)。
- 建議統一使用 ISO 8601 格式
YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS。
五、DateTime 物件導向介面(PHP 5.2+ 推薦)
$dt = new DateTime('now', new DateTimeZone('Asia/Shanghai'));
echo $dt->format('Y-m-d H:i:s');
// 修改時間
$dt->modify('+1 week');
$dt->setTime(9, 0, 0);
// 計算差值
$dt1 = new DateTime('2024-01-01');
$dt2 = new DateTime('2024-01-15');
$diff = $dt1->diff($dt2);
echo $diff->days; // 14
echo $diff->format('%a 天 %h 小時 %i 分鐘');
優勢:支援時區物件、不可變版本 DateTimeImmutable、方法鏈結、更直觀的差值計算。
六、常見陷阱與解決方案
| 現象 | 原因 | 解決 |
| 儲存到 DB 的時間比實際少 8 小時 | DB 連線時區與 PHP 時區不一致 | 連線時執行 SET time_zone = '+08:00' 或統一存 UTC |
date() 警告:It is not safe to rely on the system's timezone settings | 未設定時區 | 設定 php.ini 或呼叫 date_default_timezone_set() |
strtotime('2024-02-30') 回傳 3 月 1 日 | 自動修正無效日期 | 輸入前驗證,或用 DateTime::createFromFormat() 嚴格解析 |
| 跨 DST(日光節約時間)計算錯誤 | 直接加減秒數 | 使用 DateTime::modify() 或 DateInterval |
七、總結
- 核心函式:
time()、date()、strtotime()、date_default_timezone_set()。
- 新專案優先使用
DateTime 類別,功能更完整、時區處理更安全。
- 系統層面統一使用 UTC 存儲,顯示層按使用者時區轉換。
- 所有使用者輸入的日期字串,務必用
DateTime::createFromFormat() 指定格式解析,拒絕模糊輸入。
- 上一篇文章: PHP 使用 phpthumb_ico 類別產生 ICO 圖示完整實例
- 下一篇文章: MySQL 5.7 JSON 資料類型完整入門指南
Copyright ©
程式碼之家 All Rights Reserved