Menu

PHP 日期格式:date() 的所有格式字符

PHP 日期格式是由字母组成的字符串,比如 'Y-m-d H:i:s',其中 Y 是 4 位数的年份,m 是月,d 是日,H 是小时,i 是分钟,s 是秒。本文列出每个格式字符及其示例,还讲解了转义、ISO 8601、日文日期,以及如何把一种格式转换成另一种。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

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
NISO 星期几,1(星期一)到 7(星期日)6
w星期几,0(星期日)到 6(星期六)6
S日期的英文序数后缀:st、nd、rd 或 th,放在 j 后面使用th
z一年中的第几天,从 0 开始72

周和月

字符含义示例
WISO 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,否则为 00
oISO 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
aam 或 pmam
AAM 或 PMAM
v毫秒123
u微秒(在 date() 中始终为 000000,因为它只接受整秒)123456
BSwatch 互联网时间(000 到 999)420

时区

字符含义示例
e时区标识符UTC
T时区缩写UTC
P与 UTC 的偏移,带冒号+00:00
p和 P 相同,但 UTC 显示为 ZZ
O与 UTC 的偏移,不带冒号+0000
Z以秒为单位的偏移0
I(大写 i)夏令时期间为 1,否则为 00

完整的日期和时间

字符含义示例
cISO 8601 日期和时间2026-03-14T09:05:07+00:00
rRFC 2822 日期,用于电子邮件头Sat, 14 Mar 2026 09:05:07 +0000
UUnix 时间戳(自 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 可以按任意语言区域格式化完整的日期。

Coddy 编程语言插图

和 Coddy 一起学编程

开始