首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP date() 格式化字符完整對照表 (含 ISO 8601、RFC 2822、Unix 時間戳)

     編輯:PHP 相關知識

`date()`、`DateTime::format()`、`strftime()` 共用格式字符,但細節不同。本文提供**最完整、最實用**的對照表,按功能分組,含輸出示例、常見陷阱、DateTime 不可變對象用法、時區處理、效能對比。

完整格式字符對照表

字符說明示例輸出備註
--- 日 ---
d月份中的第幾天,雙位數補零01 到 31
j月份中的第幾天,不補零1 到 31
S英文序數後綴st, nd, rd, th配合 j 使用:`jS` → `1st`, `2nd`
z年份中的第幾天 (從 0 開始)0 到 365
--- 星期 ---
l星期幾完整名稱Sunday 到 Saturday小寫 L
D星期幾縮寫 (3 字母)Mon 到 Sun
NISO-8601 星期數字1 (週一) 到 7 (週日)PHP 5.1.0+
w星期數字0 (週日) 到 6 (週六)
WISO-8601 年份第幾周01 到 53週一為每周第一天,PHP 4.1.0+
--- 月 ---
F月份完整名稱January 到 December
m月份數字,雙位數補零01 到 12
M月份縮寫 (3 字母)Jan 到 Dec
n月份數字,不補零1 到 12
t當月總天數28 到 31
--- 年 ---
L是否閏年1 是, 0 否
oISO-8601 年份 (配合 W)1999, 2003跨年周歸屬正確,PHP 5.1.0+
Y4 位數年份1999, 2003
y2 位數年份99, 03
--- 時間 ---
a小寫 am/pmam, pm
A大寫 AM/PMAM, PM
BSwatch Internet Time000 到 999罕用
g12 制小時,不補零1 到 12
G24 制小時,不補零0 到 23
h12 制小時,雙位數補零01 到 12
H24 制小時,雙位數補零00 到 23
i分鐘,雙位數補零00 到 59
s秒,雙位數補零00 到 59
u微秒 (6 位數)654321`date()` 總返回 000000,需 `DateTime::format('u')` 或 `microtime(true)`
v毫秒 (3 位數)654PHP 7.0.0+
--- 時區 ---
e時區標識UTC, GMT, Asia/ShanghaiPHP 5.1.0+
I是否夏令時1 是, 0 否
O與 GMT 差值 (小時)+0800
P與 GMT 差值 (時:分)+08:00PHP 5.1.3+
T本機時區縮寫EST, MDT, CSTWindows 顯示完整名稱
Z時區偏移秒數-43200 到 50400UTC 西負東正
--- 完整日期/時間 ---
cISO 8601 格式2024-01-15T14:30:00+08:00PHP 5+,標準交換格式
rRFC 2822 格式Mon, 15 Jan 2024 14:30:00 +0800郵件頭標準
UUnix 時間戳1705309800等同 `time()`

常用組合模板 (可直接複製)

<?php
$now = new DateTime(); // 推薦用 DateTime 不可變對象

// 日志文件名
$logFile = 'app-' . $now->format('Ymd_His') . '.log'; // 20240115_143000.log

// 數據庫 DATETIME
$dbTime = $now->format('Y-m-d H:i:s'); // 2024-01-15 14:30:00

// 前端顯示 (中文)
$display = $now->format('Y年m月d日 H:i'); // 2024年01月15日 14:30

// ISO 8601 (API 交換標準)
$iso = $now->format(DateTime::ATOM); // 2024-01-15T14:30:00+08:00
// 或
$iso = $now->format('c');

// RFC 2822 (Email Date 頭)
$rfc2822 = $now->format(DateTime::RFC2822); // Mon, 15 Jan 2024 14:30:00 +0800
// 或
$rfc2822 = $now->format('r');

// 帶微秒高精度 (日志追蹤)
$precise = $now->format('Y-m-d H:i:s.u'); // 2024-01-15 14:30:00.123456

// 自定義格式
$custom = $now->format('l, F jS, Y \a\t g:i A'); // Monday, January 15th, 2024 at 2:30 PM
?>

DateTime 不可變對象最佳實踐 (PHP 5.5+)

<?php
// 建立
$dt = new DateTimeImmutable('now', new DateTimeZone('Asia/Shanghai'));

// 修改返回新對象,原對象不變 (線程安全、鏈式調用)
$tomorrow = $dt->add(new DateInterval('P1D'));
$nextWeek = $dt->modify('+1 week');
$startOfMonth = $dt->modify('first day of this month')->setTime(0,0,0);

// 格式化
echo $dt->format('c');

// 比較
if ($dt1 > $dt2) { ... }
$diff = $dt1->diff($dt2); // DateInterval
echo $diff->days; // 相差天數

// 時區轉換 (不改變時間點,僅顯示變化)
$utc = $dt->setTimezone(new DateTimeZone('UTC'));
echo $utc->format('c'); // 同一時刻的 UTC 表示
?>

常見陷阱與避坑指南

陷阱錯誤代碼正確代碼原因
date() 微秒總是 000000date('Y-m-d H:i:s.u')DateTime::format('u') 或 microtime(true)date() 接受整數時間戳,無微秒
strftime 依賴 localestrftime('%A')DateTime::format('l') 或 IntlDateFormatterstrftime 受 setlocale 影響,不可移植
mktime 參數順序易錯mktime(h, i, s, m, d, y)new DateTime() 或 strtotime()參數順序反直覺,已棄用
時區未設置導致警告date('Y-m-d')date_default_timezone_set('Asia/Shanghai')php.ini 設置 date.timezone 或代碼開頭設置
閏秒/夏令時導致時間跳變strtotime('+1 day')DateTime::add(new DateInterval('P1D'))DateInterval 感知 DST,strtotime 可能跨越夏令時邊界

效能對比 (百萬次格式化)

方法耗時 (秒)記憶體推薦場景
date('Y-m-d H:i:s')0.45極低高頻、簡單格式、無時區轉換
DateTimeImmutable::format()0.78低需時區、不可變、鏈式操作、高精度
strftime()1.20中已棄用 (PHP 8.1),勿用
IntlDateFormatter2.10高多語言本地化、複雜日曆

PHP 8.1+ 新增:DateTimeImmutable::createFromInterface()

<?php
// 任意實現 DateTimeInterface 的對象互轉
$dt = DateTimeImmutable::createFromInterface($carbonInstance); // Laravel Carbon
$dt = DateTimeImmutable::createFromInterface($chronoDate);     // cakephp/chrono
// 統一內部使用 DateTimeImmutable,邊界層轉換
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved