PHP date() 函數格式化參數完整速查表
date() 是 PHP 日期時間格式化最常用函數,參數超過 30 個。本文分類整理、附輸出範例、常見組合模板、時區陷阱與 DateTime 現代替代方案。
年份參數
| 參數 | 說明 | 範例輸出 |
| Y | 4 位數年份 | 2024 |
| y | 2 位數年份 | 24 |
| L | 是否閏年 (1/0) | 1 |
| o | ISO-8601 週數年份 (配合 W) | 2024 |
月份參數
| 參數 | 說明 | 範例輸出 |
| m | 2 位數月份 (01-12) | 01 |
| n | 月份不補零 (1-12) | 1 |
| F | 英文全名 | January |
| M | 3 字母縮寫 | Jan |
| t | 該月天數 (28-31) | 31 |
日期參數
| 參數 | 說明 | 範例輸出 |
| d | 2 位數日期 (01-31) | 05 |
| j | 日期不補零 (1-31) | 5 |
| z | 年間第幾天 (0-365) | 4 |
星期參數
| 參數 | 說明 | 範例輸出 |
| w | 數字星期 (0=週日, 6=週六) | 5 |
| D | 3 字母縮寫 | Fri |
| l | 英文全名 (小寫 L) | Friday |
| N | ISO-8601 星期 (1=週一, 7=週日) | 5 |
| W | 年間第幾週 (ISO-8601,週一開始) | 01 |
時間參數
| 參數 | 說明 | 範例輸出 |
| g | 12 小時制不補零 (1-12) | 3 |
| h | 12 小時制補零 (01-12) | 03 |
| G | 24 小時制不補零 (0-23) | 15 |
| H | 24 小時制補零 (00-23) | 15 |
| i | 分鐘補零 (00-59) | 30 |
| s | 秒數補零 (00-59) | 45 |
| u | 微秒 (PHP 5.2.2+,date() 永遠 000000,需 DateTime) | 000000 |
AM/PM 參數
| 參數 | 說明 | 範例輸出 |
| a | 小寫 am/pm | pm |
| A | 大寫 AM/PM | PM |
時區與標準格式
| 參數 | 說明 | 範例輸出 |
| e | 時區識別符 | Asia/Taipei |
| T | 伺服器時區縮寫 | CST |
| O | GMT 偏移 (小時) | +0800 |
| P | GMT 偏移 (時:分) | +08:00 |
| c | ISO 8601 完整格式 | 2024-01-05T15:30:45+08:00 |
| r | RFC 2822 格式 | Fri, 05 Jan 2024 15:30:45 +0800 |
| U | Unix 時間戳 (秒) | 1704449445 |
其他參數
| 參數 | 說明 | 範例 |
| S | 英文序數後綴 (st/nd/rd/th) | 5th, 1st, 2nd, 3rd |
| I | 是否夏令時 (1/0) | 0 |
| B | Swatch Internet Time (000-999) | 456 |
常用組合模板 (可直接複製)
<?php
$now = time(); // 或 new DateTime()
// 1. 標準日期時間
echo date('Y-m-d H:i:s', $now); // 2024-01-05 15:30:45
echo date('Y/m/d H:i:s', $now); // 2024/01/05 15:30:45
// 2. 純日期
echo date('Y-m-d', $now); // 2024-01-05
echo date('Y年m月d日', $now); // 2024年01月05日 (需 UTF-8)
// 3. 純時間
echo date('H:i:s', $now); // 15:30:45
echo date('h:i:s A', $now); // 03:30:45 PM
// 4. 含星期
echo date('Y-m-d (D)', $now); // 2024-01-05 (Fri)
echo date('Y-m-d l', $now); // 2024-01-05 Friday
// 5. 標準交換格式 (API、日誌、資料庫)
echo date('c', $now); // 2024-01-05T15:30:45+08:00 (ISO 8601)
echo date(DATE_RFC3339, $now); // 同上 (常數別名)
echo date('r', $now); // Fri, 05 Jan 2024 15:30:45 +0800 (RFC 2822)
// 6. 檔案命名/日誌前綴 (無特殊字元)
echo date('Ymd_His', $now); // 20240105_153045
// 7. 友好顯示
echo date('n月j日 H:i', $now); // 1月5日 15:30
?>
⚠️ 關鍵陷阱與最佳實踐
1. 時區必須正確設定
<?php
// php.ini (推薦)
date.timezone = "Asia/Taipei"
// 或代碼中設定 (需在 date() 前)
date_default_timezone_set('Asia/Taipei');
// 驗證
echo date_default_timezone_get(); // Asia/Taipei
?>
未設定會觸發 E_WARNING 並預設 UTC,導致時間偏移 8 小時 (台灣/中國)。
2. date() 無法輸出微秒
<?php
// date('u') 永遠返回 000000
// 必須用 DateTime
$dt = new DateTime();
echo $dt->format('Y-m-d H:i:s.u'); // 2024-01-05 15:30:45.123456
?>
3. DateTime 現代替代方案 (強烈建議)
<?php
// 物件導向、不可變 (PHP 5.5+ DateTimeImmutable)、鏈式操作、時區感知
$dt = new DateTimeImmutable('now', new DateTimeZone('Asia/Taipei'));
echo $dt->format('Y-m-d H:i:s.u'); // 含微秒
echo $dt->modify('+1 day')->format('c'); // 日期運算
echo $dt->diff(new DateTime('2024-12-31'))->format('%a 天'); // 差值計算
// 格式化常數
echo $dt->format(DATE_ATOM); // ISO 8601
echo $dt->format(DATE_COOKIE); // Cookie 格式
echo $dt->format(DATE_RFC3339); // RFC 3339
?>
4. 效能:批量格式化用 date()、單點用 DateTime
<?php
// 迴圈中大量格式化:date() 比 DateTime 快 3-5 倍
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) date('Y-m-d H:i:s');
echo microtime(true) - $start; // ~0.08s
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) (new DateTime())->format('Y-m-d H:i:s');
echo microtime(true) - $start; // ~0.35s
?>
速查卡片 (列印備用)
Y y L o 年份
m n F M t 月份
d j z 日期
w D l N W 星期
g h G H i s u 時間
a A AM/PM
e T O P 時區
c r U 標準格式
S I B 其他
日期時間處理是業務邏輯高發區,建立統一 DateTimeHelper 工具類、全專案強制 DateTimeImmutable、資料庫存 DATETIME (UTC)、顯示時轉換用戶時區,能消除 90% 的時區 Bug。