strtotime('-1 day')可自动处理月末、闰年等边界情况,但需避免空格和复数形式;datetime类更可控且不受locale影响;硬算time()-86400忽略夏令时,不推荐;必须显式设置时区以防结果错误。

用 strtotime() 最快搞定
直接写 strtotime('-1 day') 就行,它会自动处理月末、闰年等边界情况。比如今天是 2024-03-01,减一天得到 2024-02-29;今天是 2023-01-01,结果就是 2022-12-31。
常见错误是写成 strtotime(' -1 day')(开头多空格),PHP 会返回 false,后续 date() 就输出 1970-01-01。另外别用 strtotime('-1 days') —— 复数形式在部分 PHP 版本里不兼容,老老实实写 day 单数。
典型用法:
echo date('Y-m-d', strtotime('-1 day'));
用 DateTime 类更可控
需要链式操作、时区控制或多次增减时,DateTime 更可靠。它不会像 strtotime() 那样受系统 locale 影响,也更容易调试。
注意点:
-
modify()是原地修改,sub()返回新对象(PHP 5.3+) - 别漏掉
new DateTime()的括号,写成new DateTime会报错 - 如果传入字符串如
new DateTime('2023-10-01'),减一天后仍是那个时区的本地时间,不是 UTC
示例:
$dt = new DateTime();<br>$dt->modify('-1 day');<br>echo $dt->format('Y-m-d');
小心 time() - 86400 这种硬算
有人图快直接用 time() - 86400,但这是错的:它忽略夏令时切换(比如某天只有 23 小时)、服务器时区设置、以及跨月/跨年时的日期逻辑。86400 秒 ≠ 1 天,尤其在 DST 调整日。
只在极少数场景下可考虑硬算:
- 你确定运行环境永远不开夏令时
- 只要求“往前推 86400 秒”,而不是“昨天”这个语义
- 且时间精度只要到秒级,不关心日期显示
否则一律避开。
时区没设好,结果就错
PHP 默认时区是 UTC 或系统配置值,如果你代码里没显式指定,strtotime() 和 DateTime 都可能按错时区解析。比如服务器在 UTC+0,但你要处理的是 Asia/Shanghai 时间,不设时区的话,“昨天”可能差出整整一天。
解决方法:
- 全局设:
date_default_timezone_set('Asia/Shanghai'); - 或实例化时指定:
new DateTime('now', new DateTimeZone('Asia/Shanghai'));
没设时区的代码,在本地开发和生产环境容易表现不一致,这点最容易被忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











