PHP 日期格式是一个字符串,其中的字母代表日期的各个部分:date('Y-m-d H:i:s') 会输出类似 2026-03-14 09:05:07 的结果。Y 是 4 位数的年份,m 是月,d 是日,H 是小时(24 小时制),i 是分钟,s 是秒;不是格式字母的字符,比如 -、/ 或 :,都会原样输出。同样的格式字符串既可以用在 date() 中,也可以用在 DateTimeImmutable::format() 中。
修改 $format,然后点击“运行”。日期固定为 2026年3月14日星期六 09:05:07,这样你就能清楚地看到每个字母的作用:
输出:
Sat, 14 Mar 2026 09:05
2026-03-14
14/03/2026
Saturday, March 14th, 2026
9:05 AM
date($format) 格式化当前时刻,date($format, $timestamp) 格式化一个时间戳;$date->format($format) 格式化一个日期对象。关于日期的其他内容,从 strtotime() 到时区,都在 PHP date() 页面中。
日期格式字符
下面每个示例都是 2026-03-14 09:05:07.123456 UTC 的结果。
日
| 字符 | 含义 | 示例 |
|---|---|---|
d | 月份中的第几天,2 位数,带前导零(01 到 31) | 14 |
j | 月份中的第几天,不带前导零(1 到 31) | 14 |
D | 星期的英文缩写,3 个字母 | Sat |
l(小写 L) | 星期的英文全称 | Saturday |
N | ISO 星期几,1(星期一)到 7(星期日) | 6 |
w | 星期几,0(星期日)到 6(星期六) | 6 |
S | 日期的英文序数后缀:st、nd、rd 或 th,放在 j 后面使用 | th |
z | 一年中的第几天,从 0 开始 | 72 |
周和月
| 字符 | 含义 | 示例 |
|---|---|---|
W | ISO 8601 周数(每周从星期一开始) | 11 |
F | 月份的英文全称 | March |
M | 月份的英文缩写,3 个字母 | Mar |
m | 月份数字,带前导零(01 到 12) | 03 |
n | 月份数字,不带前导零(1 到 12) | 3 |
t | 该月的天数 | 31 |
年
| 字符 | 含义 | 示例 |
|---|---|---|
Y | 完整年份,至少 4 位数 | 2026 |
y | 年份,2 位数 | 26 |
L | 闰年为 1,否则为 0 | 0 |
o | ISO 8601 周编号所属的年份(和 W 一起使用) | 2026 |
X | 带正负号的扩展完整年份(PHP 8.2+) | +2026 |
x | 扩展完整年份,只在需要时带正负号(PHP 8.2+) | 2026 |
时间
| 字符 | 含义 | 示例 |
|---|---|---|
H | 小时,24 小时制,带前导零(00 到 23) | 09 |
G | 小时,24 小时制,不带前导零(0 到 23) | 9 |
h | 小时,12 小时制,带前导零(01 到 12) | 09 |
g | 小时,12 小时制,不带前导零(1 到 12) | 9 |
i | 分钟,带前导零(00 到 59) | 05 |
s | 秒,带前导零(00 到 59) | 07 |
a | am 或 pm | am |
A | AM 或 PM | AM |
v | 毫秒 | 123 |
u | 微秒(在 date() 中始终为 000000,因为它只接受整秒) | 123456 |
B | Swatch 互联网时间(000 到 999) | 420 |
时区
| 字符 | 含义 | 示例 |
|---|---|---|
e | 时区标识符 | UTC |
T | 时区缩写 | UTC |
P | 与 UTC 的偏移,带冒号 | +00:00 |
p | 和 P 相同,但 UTC 显示为 Z | Z |
O | 与 UTC 的偏移,不带冒号 | +0000 |
Z | 以秒为单位的偏移 | 0 |
I(大写 i) | 夏令时期间为 1,否则为 0 | 0 |
完整的日期和时间
| 字符 | 含义 | 示例 |
|---|---|---|
c | ISO 8601 日期和时间 | 2026-03-14T09:05:07+00:00 |
r | RFC 2822 日期,用于电子邮件头 | Sat, 14 Mar 2026 09:05:07 +0000 |
U | Unix 时间戳(自 1970-01-01 UTC 起的秒数) | 1773479107 |
下面是可以实时运行的同一张表:这段代码会为你选定的日期输出每一个字符的结果。试试填入你的生日、某个下午的时间,或者闰年的最后一天:
在格式中输出字母和单词
格式字符串中的任何字母都会被当作格式字符,所以 'Today is l' 不会输出“Today is”:T、o、d、a、y、i 和 s 都是格式字符。在每个想原样输出的字母前面加一个反斜杠。在双引号字符串中,\t 本身就是制表符,所以带反斜杠的格式要用单引号:
输出:
UTC202614am26 0507 Saturday
Today is Saturday
Saturday the 14th of March
2026-03-14T09:05:07
Saturday 09UTC 14th
常用的日期格式
大多数代码只需要少数几种格式。下面这段代码会把它们输出为一个 HTML 表格,所以会显示在“页面”标签页中:
存储和比较日期时,请使用 Y-m-d 或 Y-m-d H:i:s:按这种顺序排列的字符串,排序结果和日期本身的顺序一致,而 d/m/Y 格式的字符串做不到。
ISO 8601、DATE_ATOM 和其他标准格式
PHP 为 API、订阅源和 cookie 需要的格式提供了常量。DATE_ATOM(也可以写成 DateTimeInterface::ATOM)就是 ISO 8601 和 RFC 3339 格式,JSON API 使用的正是它:
输出:
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07.000+00:00
Sat, 14 Mar 2026 09:05:07 +0000
Sat, 14 Mar 2026 09:05:07 +0000
Saturday, 14-Mar-2026 09:05:07 UTC
Y-m-d\TH:i:sP
还有一个 DATE_ISO8601 常量,但它的偏移没有冒号(+0000),ISO 8601 不允许这种写法;请使用 DATE_ATOM。
日文日期格式(Y年m月d日)
不是格式字母的字符会原样输出,汉字也一样,所以 'Y年n月j日' 可以直接这样写,中文日期同样适用。n 和 j 会去掉前导零(3月14日),m 和 d 会保留前导零(03月14日)。星期几是 date() 唯一无法翻译的部分,因为它只认识英文名称;可以把 w 得到的数字映射到你自己的列表:
输出:
2026年3月14日
2026年03月14日 09時05分
2026年3月14日(土)
2026/03/14
如果要完整的本地化,包括其他语言的月份名称和日本年号(令和),可以使用 intl 扩展的 IntlDateFormatter,它按语言区域的模式进行格式化。它使用的是 ICU 模式字母(yyyy、MM、EEEE),而不是本页介绍的 PHP 格式字符:
<?php
$formatter = new IntlDateFormatter('ja_JP', IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'Asia/Tokyo');
echo $formatter->format(new DateTimeImmutable('2026-03-14')); // 2026年3月14日土曜日
$era = new IntlDateFormatter('ja_JP@calendar=japanese', IntlDateFormatter::LONG, IntlDateFormatter::NONE, 'Asia/Tokyo', IntlDateFormatter::TRADITIONAL);
echo $era->format(new DateTimeImmutable('2026-03-14')); // 令和8年3月14日
把日期从一种格式转换成另一种
要把 14/03/2026 转换成 2026-03-14,先用 DateTimeImmutable::createFromFormat() 按字符串原本的格式解析它,再重新格式化。它使用的字符和上面的表格相同。格式要以 ! 开头,否则你没有提供的字段(这里是时间)会用当前时刻填充:
输出:
2026-03-14 00:00:00
March 14, 2026
bool(false)
2026-03-03
Array
(
[10] => The parsed date was invalid
)
对于用户输入的日期,getLastErrors() 返回的任何警告都应该当作无效日期处理,就像处理 false 一样。
日期格式的常见错误
有三个 bug 反复出现:本该写 i 的地方写成了 m,Y 和 y 混用,以及让 strtotime() 去猜日和月的顺序。strtotime() 把斜杠解读为美式的“月/日”顺序,把短横线或点解读为“日-月”顺序,所以同样的数字会得出两个不同的日期:
输出:
09:03:07
09:05:07
14/03/26
2026-03-04
2026-04-03
bool(false)
如果你知道输入的格式,就用 createFromFormat() 明确指定,而不要让 strtotime() 去猜。
常见问题
PHP 中 date('Y-m-d') 是什么意思?
每个字母都会被替换成日期的一部分:Y 是 4 位数的年份,m 是带前导零的月份,d 是带前导零的日,短横线则原样输出。在 2026年3月14日,它返回 2026-03-14。
PHP 中怎么把日期从一种格式转换成另一种?
先按日期当前的格式解析它,再用你想要的格式输出:DateTimeImmutable::createFromFormat('!d/m/Y', '14/03/2026')->format('Y-m-d') 返回 2026-03-14。如果字符串和格式不匹配,createFromFormat() 会返回 false,所以要先检查这一点。
PHP 日期格式中的 m 和 i 有什么区别?
m 是月份(01 到 12),i 是分钟(00 到 59)。把 'H:i' 写成 'H:m' 是一个常见的 bug:时间里本该显示分钟的位置显示的却是月份。
PHP 中怎么把日期格式化为 ISO 8601?
使用 c 字符或 DATE_ATOM 常量:$date->format(DATE_ATOM) 返回 2026-03-14T09:05:07+00:00。不要使用 DATE_ISO8601:它的时区偏移没有冒号(+0000),不是合法的 ISO 8601 格式。
怎么用 PHP 的 date() 显示日文的星期几?
date() 只会输出英文名称,所以要把 w 得到的数字(0 表示星期日,6 表示星期六)映射到你自己的列表:['日','月','火','水','木','金','土'][$date->format('w')]。如果有 intl 扩展,IntlDateFormatter 可以按任意语言区域格式化完整的日期。