DateTime::format() 是 PHP 最安全推荐的日期格式化方式,需基于 DateTime 实例调用,支持时区、微秒及 ISO 周(o-W),而 date() 依赖全局时区且不支持微秒和准确 ISO 周。

直接说结论: DateTime::format() 是 PHP 里最安全、最推荐的日期格式化方式,比 date() 更可靠,尤其在涉及时区、对象操作或后续计算时——别再无脑用 date() 配 strtotime() 了。
DateTime::format() 的基本调用方式
它必须作用于一个有效的 DateTime 实例,不能直接传字符串或时间戳。常见错误是试图这样写:DateTime::format('Y-m-d', '2025-01-01') —— 这会报 Fatal error: Non-static method DateTime::format() cannot be called statically。
正确流程只有两步:
- 先用
new DateTime()或DateTime::createFromFormat()创建对象 - 再链式调用
->format('...')
示例:
立即学习“PHP免费学习笔记(深入)”;
$dt = new DateTime('2026-08-31');
echo $dt->format('Y年m月d日'); // 输出:2026年08月31日
格式字符串里哪些字符要特别注意
不是所有字母都能直接当字面量输出。比如你想输出 2026
08(带换行符),写 $dt->format('Y
m') 会把
当成换行符解析,结果变成两行;而 Y 和 m 仍是格式符。要输出真实反斜杠+字母,得用双反斜杠转义:
-
$dt->format('Y\\n m')→ 输出2026 08 - 单个
要写成\\,因为 PHP 字符串解析 + format 解析各吃一层 - 常见需转义的字符:
、、、\,还有格式符本身如Y、m如果你真想输出字母 Y/m,也得加反斜杠:\Y\m
为什么不用 date()?关键差异在哪
date() 只接受整数时间戳,天生丢失时区上下文;DateTime::format() 作用于带时区的对象,能准确反映本地化时间。比如:
$tz = new DateTimeZone('Asia/Shanghai');
$dt = new DateTime('now', $tz);
echo $dt->format('Y-m-d H:i:s T'); // 输出:2026-08-31 16:07:00 CST
而 date('Y-m-d H:i:s T') 依赖 date_default_timezone_set() 全局设置,且 T 在 date() 中不保证可靠(可能输出空或错误缩写)。
-
date()对微秒支持为 0;DateTime::format()可配合DateTimeImmutable和f/F格式符输出微秒 - 数据库写入前,如果用
date('Y-m-d H:i:s')拼字符串,时区错位后存进去的就是错的;用$dt->format('Y-m-d H:i:s')则始终基于对象当前时区快照
容易被忽略的 ISO 周相关坑
要输出“第几周”,别用 Y-W。例如 (new DateTime('2024-12-30'))->format('Y-W') 得到的是 2024-01,但那天其实是 ISO 2025 年第 1 周。正确写法是用 o-W:
-
o表示 ISO-8601 年份(按周归属),Y是日历年份 -
$dt->format('o-W')才能确保周和年匹配 ISO 定义 - 这个区别在跨年那几天(12 月最后一周 / 1 月第一周)必现,但很难测出来
如果你只是展示“今天几号”,Y-m-d 没问题;一旦涉及“本周”“本年第X周”,o 就不是可选项,是必选项。



















