PHP 提供豐富的日期時間處理功能,從傳統 date() 到物件導向 DateTime,本文整理常用函數、格式字元對照表與最佳實務。
| 函數 | 用途 | 回傳 | 備註 |
|---|---|---|---|
date(string $format, ?int $timestamp=null) | 格式化時間戳為字串 | string | 最常用,$timestamp 預設為 time() |
time() | 取得當前 Unix 時間戳 | int | 秒數,1970-01-01 00:00:00 UTC 起 |
microtime(bool $asFloat=false) | 取得微秒級時間 | string|float | 精度測試、唯一 ID 生成常用 |
mktime(int $h, $m, $s, $mon, $day, $year) | 由日期時間組件建立時間戳 | int|false | 參數可超出範圍自動進位 |
strtotime(string $datetime, ?int $base=null) | 解析英文文字日期為時間戳 | int|false | 極強大:"next Monday", "+3 days", "last day of" |
checkdate(int $m, $d, $y) | 驗證日期合法性 | bool | 含閏年判斷 |
getdate(?int $timestamp=null) | 取得日期時間關聯陣列 | array | 鍵:seconds, minutes, hours, mday, mon, year, wday, yday, weekday, month, 0 |
gmdate() | 格式化 GMT/UTC 時間 | string | 同 date() 但強制 UTC |
DateTime 類別 | 物件導向日期時間操作 | Object | 支援時區、加減運算、格式化、比較、不可變版 DateTimeImmutable |
| 字元 | 說明 | 範例 |
|---|---|---|
| Y | 4 位數年 | 2024 |
| y | 2 位數年 | 24 |
| m | 月份,補 0 | 01-12 |
| n | 月份,不補 0 | 1-12 |
| F | 月份英文全名 | January |
| M | 月份英文縮寫 | Jan |
| d | 日期,補 0 | 01-31 |
| j | 日期,不補 0 | 1-31 |
| H | 24 小時制,補 0 | 00-23 |
| h | 12 小時制,補 0 | 01-12 |
| G | 24 小時制,不補 0 | 0-23 |
| g | 12 小時制,不補 0 | 1-12 |
| i | 分鐘,補 0 | 00-59 |
| s | 秒,補 0 | 00-59 |
| u | 微秒(需 DateTime) | 654321 |
| a | am/pm 小寫 | am |
| A | AM/PM 大寫 | PM |
| l | 星期幾全名 | Monday |
| D | 星期幾縮寫 | Mon |
| w | 星期幾數字 | 0(日)-6(六) |
| z | 一年中的第幾天 | 0-365 |
| W | 一年中的第幾週 | 01-53 |
| t | 該月天數 | 28-31 |
| S | 序數尾綴 | st, nd, rd, th |
| c | ISO 8601 格式 | 2024-01-15T14:30:00+08:00 |
| r | RFC 2822 格式 | Mon, 15 Jan 2024 14:30:00 +0800 |
| U | Unix 時間戳 | 1705300200 |
<?php
$dt = new DateTime('now', new DateTimeZone('Asia/Taipei'));
echo $dt->format('Y-m-d H:i:s'); // 2024-01-15 14:30:00
// 加減運算
$dt->modify('+1 month')->modify('-3 days');
echo $dt->format('Y-m-d');
// 比較
$dt1 = new DateTime('2024-01-01');
$dt2 = new DateTime('2024-12-31');
$diff = $dt1->diff($dt2);
echo $diff->format('%a 天'); // 365 天
// 時區轉換
$utc = new DateTime('now', new DateTimeZone('UTC'));
$utc->setTimezone(new DateTimeZone('America/New_York'));
echo $utc->format('Y-m-d H:i:s T');
?>
DateTime / DateTimeImmutable**,避免 date() + strtotime() 的 32 位元系統 2038 年問題。date_default_timezone_set('Asia/Taipei') 或 php.ini date.timezone。掌握這些工具,日期時間處理將不再是 Bug 溫床。