專案中常需將時間戳格式化為多種顯示格式 (中文完整、標準 ISO、短日期) 並顯示中文星期。本文封裝一個 ShowDate() 函數:支援指定時間字串/預設當前時間、三種輸出格式旗標、自動設定 PRC 時區、中文星期映射,並分析 date() 格式字元與常見陷阱。
date('Y年m月d日 H:i:s', $timestamp) . " {$week[$w]}", // 2024年01月15日 10:30:45 星期一
1 => date('Y年m月d日 H:i:s', $timestamp) . " {$week[$w]}", // 同 0
2 => date('Y-m-d H:i:s', $timestamp) . " {$week[$w]}", // 2024-01-15 10:30:45 星期一
3 => date('y/m/d', $timestamp), // 24/01/15
default => date('Y年m月d日 H:i:s', $timestamp) . " {$week[$w]}",
};
}
// 使用範例
echo ShowDate(0); // 當前時間,中文完整格式
echo ShowDate(2, '2024-12-25 00:00:00'); // 指定時間,ISO 格式
echo ShowDate(3); // 短日期
| 字元 | 含義 | 範例 |
|---|---|---|
Y | 4位數年 | 2024 |
y | 2位數年 | 24 |
m | 月份 01-12 | 01 |
n | 月份 1-12 (無前導零) | 1 |
d | 日期 01-31 | 15 |
j | 日期 1-31 | 15 |
H | 24小時 00-23 | 10 |
h | 12小時 01-12 | 10 |
i | 分鐘 00-59 | 30 |
s | 秒 00-59 | 45 |
w | 星期 0(日)-6(六) | 1 |
W | 年度第幾週 | 03 |
date_default_timezone_set('PRC') 或 php.ini date.timezone = PRC。未設定預設 UTC,導致顯示時間偏移 8 小時。strtotime() 解析格式限制:支援 "Y-m-d H:i:s"、"Y/m/d"、英文月份、相對時間 ("+1 day", "next Monday")。不支援中文格式 ("2024年1月15日")。m vs n:m 輸出 01,n 輸出 1。同理 d/j、H/h。date('u') 僅在 microtime(true) 或 DateTime 物件可用。date() 接收整數時間戳無微秒。DateTime / DateTimeImmutable 物件導向、時區感知、鏈式操作、格式化更強大:
$dt = new DateTime('now', new DateTimeZone('PRC'));
echo $dt->format('Y年m月d日 H:i:s l'); // l 為英文完整星期
// 中文星期需自行映射
function formatDate(
string $format = 'Y-m-d H:i:s',
?string $time = null,
string $timezone = 'PRC',
string $locale = 'zh_TW'
): string {
$dt = new DateTime($time ?? 'now', new DateTimeZone($timezone));
$weekMap = [
'zh_TW' => ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
'zh_CN' => ['周日','周一','周二','周三','周四','周五','周六'],
'en' => ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
];
$week = $weekMap[$locale] ?? $weekMap['zh_TW'];
$format = str_replace('{W}', $week[(int)$dt->format('w')], $format);
return $dt->format($format);
}
// 使用: formatDate('Y年m月d日 {W}', '2024-01-15', 'PRC', 'zh_TW');
日期格式化是業務邏輯高頻操作。封裝統一工具函數、強制時區設定、採用 DateTime 物件替代過程式函數,能消除時區 Bug、提升代碼可測試性與國際化支援度。