最直接且不易出错的方式是 date('Y-m-d', strtotime('-1 day'));它自动处理跨月跨年边界,但需注意时区设置,推荐开头显式调用 date_default_timezone_set()。

用 date() 和 strtotime() 最直接
PHP 获取昨天日期最常用、也最不容易出错的方式就是组合 date() 与 strtotime():
date('Y-m-d', strtotime('-1 day'))
。它会返回类似 2024-06-14 的字符串。注意:这里的 -1 day 是 strtotime() 支持的相对时间表达式,不是数学运算,不能写成 time() - 86400(时区或夏令时下可能不准)。
需要带时间或不同格式?改 date() 的第一个参数就行
date() 的格式字符串决定输出样式,和“获取昨天”这个逻辑无关。比如:
-
date('Y-m-d H:i:s', strtotime('-1 day'))→2024-06-14 15:30:22 -
date('m/d/Y', strtotime('-1 day'))→06/14/2024 -
date('Ymd', strtotime('-1 day'))→20240614
别硬记格式符,查 PHP 官方文档 date() 函数页的“格式字符”表更可靠;避免用 F(英文月份名)等易受 setlocale() 影响的格式,除非你明确控制了本地化环境。
用 DateTime 类更健壮,但要注意对象生命周期
面向对象写法适合复杂时间操作,但对“取昨天”这种简单需求略重。正确写法是:
(new DateTime())->modify('-1 day')->format('Y-m-d')
。常见错误包括:
- 写成
DateTime::modify('-1 day')(静态调用失败,modify()是实例方法) - 复用同一个
DateTime对象多次modify()却没重置,导致结果叠加 - 忽略
DateTime默认使用当前时区,若服务器时区非预期(如 UTC),结果会偏差
如果项目已大量使用 DateTime,保持风格统一没问题;否则单行脚本里用 strtotime() 更轻量。
跨月/跨年边界情况不用额外处理
strtotime('-1 day') 和 DateTime::modify() 都能自动处理月末(如从 3 月 1 日减 1 天得 2 月 29 日或 28 日)、年初等边界,无需 if 判断天数或月份长度。但要注意:如果传入的是人为拼接的日期字符串(如 "2024-03-01")再加 strtotime(),必须确保格式被正确识别(推荐用 Y-m-d,避免 m/d/Y 在某些地区被误判为 d/m/Y)。
真正容易被忽略的是时区——strtotime() 解析相对时间时依赖当前默认时区,而默认时区可能来自 php.ini、date_default_timezone_set() 或系统设置。哪怕只是临时脚本,也建议开头显式设一次:date_default_timezone_set('Asia/Shanghai');。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











