PHP 日期時間處理完全指南:date、mktime、strtotime 實戰用法
PHP 提供強大的日期時間函數族群。本文系統整理 date() 格式化字元、mktime() 產生時間戳、strtotime() 解析英文文字日期的核心用法,附帶完整範例表格。
一、date() 格式化字元速查表
| 字元 | 說明 | 範例輸出 |
| Y | 4 位數年份 | 2024 |
| y | 2 位數年份 | 24 |
| m | 月份(補 0) | 03 |
| n | 月份(不補 0) | 3 |
| M | 月份縮寫(英文) | Mar |
| F | 月份全名(英文) | March |
| d | 日期(補 0) | 09 |
| j | 日期(不補 0) | 9 |
| S | 日期後綴 | th, st, nd, rd |
| H | 24 小時制(補 0) | 16 |
| G | 24 小時制(不補 0) | 16 |
| h | 12 小時制(補 0) | 04 |
| g | 12 小時制(不補 0) | 4 |
| i | 分鐘(補 0) | 42 |
| s | 秒數(補 0) | 26 |
| a | am/pm 小寫 | pm |
| A | AM/PM 大寫 | PM |
| l | 星期幾全名 | Thursday |
| D | 星期幾縮寫 | Thu |
| L | 是否閏年 | 1 或 0 |
| w | 星期幾(0=週日) | 4 |
| z | 一年中的第幾天 | 68 |
| W | 一年中的第幾週 | 10 |
| t | 當月總天數 | 31 |
| U | Unix 時間戳 | 1710000000 |
| c | ISO 8601 格式 | 2024-03-09T16:42:26+08:00 |
| r | RFC 2822 格式 | Sat, 09 Mar 2024 16:42:26 +0800 |
二、mktime() 產生指定時間戳
// 原型:mktime(時, 分, 秒, 月, 日, 年, 是否夏令時)
// 明天 00:00:00 的時間戳
$tomorrow = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y'));
echo "明天是 " . date('Y/m/d', $tomorrow);
三、strtotime() 解析相對/絕對時間
// 絕對時間字串
$d = strtotime("10:38pm April 15 2015");
echo date("Y-m-d h:i:sa", $d);
// 相對時間(極其強大)
echo date("Y-m-d H:i:s", strtotime("tomorrow")); // 明天
echo date("Y-m-d H:i:s", strtotime("next Saturday")); // 下週六
echo date("Y-m-d H:i:s", strtotime("+3 Months")); // 3 個月後
echo date("Y-m-d H:i:s", strtotime("last day of next month")); // 下月最後一天
echo date("Y-m-d H:i:s", strtotime("first day of this month")); // 本月第一天
四、常見實戰場景
| 需求 | 代碼 |
| 今天 00:00:00 時間戳 | strtotime('today') 或 mktime(0,0,0) |
| 本週一 00:00:00 | strtotime('monday this week') |
| 本月第一天/最後一天 | strtotime('first day of this month') / strtotime('last day of this month') |
| 判斷是否同一天 | date('Ymd', $t1) === date('Ymd', $t2) |
| 計算兩日期相差天數 | floor(abs($t1 - $t2) / 86400) |
| 格式化為中文 | date('Y年m月d日 H:i:s', $timestamp) |
| 時區處理 | date_default_timezone_set('Asia/Taipei'); 放在腳本最前面 |
五、進階:DateTime 類(PHP 5.2+ 推薦)
$dt = new DateTime('now', new DateTimeZone('Asia/Taipei'));
echo $dt->format('Y-m-d H:i:s');
// 日期運算
$dt->modify('+1 month');
$dt->sub(new DateInterval('P7D')); // 減 7 天
// 比較
$dt1 = new DateTime('2024-01-01');
$dt2 = new DateTime('2024-12-31');
$diff = $dt1->diff($dt2);
echo $diff->days; // 365