date() 格式字元完整對照表
| 字元 | 說明 | 範例 |
| Y | 4 位數年 | 2024 |
| y | 2 位數年 | 24 |
| m | 月份(01-12) | 01 |
| n | 月份(1-12)不補零 | 1 |
| F | 月份完整英文名 | January |
| M | 月份縮寫 | Jan |
| d | 日期(01-31) | 05 |
| j | 日期(1-31)不補零 | 5 |
| D | 星期縮寫 | Mon |
| l | 星期完整名 | Monday |
| N | ISO-8601 星期(1=週一..7=週日) | 1 |
| w | 星期(0=週日..6=週六) | 0 |
| H | 24 小時(00-23) | 14 |
| G | 24 小時不補零 | 14 |
| h | 12 小時(01-12) | 02 |
| g | 12 小時不補零 | 2 |
| i | 分鐘(00-59) | 05 |
| s | 秒(00-59) | 09 |
| a | am/pm 小寫 | pm |
| A | AM/PM 大寫 | PM |
| u | 微秒(PHP 5.2.2+) | 123456 |
| U | Unix 時間戳 | 1704432309 |
| z | 年內第幾天(0-365) | 4 |
| W | ISO-8601 週數 | 01 |
| t | 該月總天數 | 31 |
| S | 英文序數後綴 | st, nd, rd, th |
| c | ISO 8601 格式 | 2024-01-05T14:05:09+08:00 |
| r | RFC 2822 格式 | Fri, 05 Jan 2024 14:05:09 +0800 |
常用格式範例
<?php
echo date('Y-m-d H:i:s'); // 2024-01-05 14:05:09
echo date('Y/m/d'); // 2024/01/05
echo date('l, F jS, Y'); // Friday, January 5th, 2024
echo date('D, d M Y H:i:s O'); // Fri, 05 Jan 2024 14:05:09 +0800
echo date('c'); // 2024-01-05T14:05:09+08:00 (ISO 8601)
echo date('Y-m-d\TH:i:sP'); // 同 c,手動指定
?>
時區處理
<?php
// 設定預設時區(腳本開頭或 php.ini)
date_default_timezone_set('Asia/Taipei');
// 或 DateTime 物件指定時區
$dt = new DateTime('now', new DateTimeZone('UTC'));
echo $dt->format('Y-m-d H:i:s'); // UTC 時間
// 轉換時區
$dt->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo $dt->format('Y-m-d H:i:s'); // 東京時間
?>
DateTime 物件導向用法(推薦)
<?php
// 建立
$dt = new DateTime(); // 現在
$dt = new DateTime('2024-01-05 14:05'); // 字串解析
$dt = DateTime::createFromFormat('Y/m/d', '2024/01/05'); // 指定格式
// 運算
$dt->modify('+1 day');
$dt->add(new DateInterval('P1M')); // 加 1 月
$dt->sub(new DateInterval('PT1H')); // 減 1 小時
// 差值
$diff = $dt1->diff($dt2);
echo $diff->format('%a 天 %h 小時 %i 分鐘');
// 格式化
echo $dt->format('Y-m-d H:i:s');
// 靜態工廠
$dt = DateTimeImmutable::createFromFormat('Y-m-d', '2024-01-05'); // 不可變
?>
時間戳互轉
<?php
// Unix 時間戳 → DateTime
$dt = DateTime::createFromFormat('U', '1704432309');
$dt->setTimezone(new DateTimeZone('Asia/Taipei'));
// DateTime → 時間戳
$timestamp = $dt->getTimestamp(); // 或 $dt->format('U')
// 微秒精度
$dt = new DateTime();
echo $dt->format('Y-m-d H:i:s.u'); // 2024-01-05 14:05:09.123456
?>
最佳實踐
- 新專案優先使用 DateTime/DateTimeImmutable,避免 date() 時區副作用
- 資料庫儲存
TIMESTAMP 或 DATETIME,應用層統一 UTC
- 使用者顯示時依偏好時區轉換
- 避免字串拼接日期,使用
DateInterval 運算
- 序列化傳輸用 ISO 8601 (
c 格式)