在PHP项目里,获取去年今日的日期是一个常见需求,比如做年度数据对比、计算一年前注册时间等。下面介绍几种稳定且易用的实现方法。

使用DateTime类获取去年今日
PHP的DateTime类提供了直观的日期修改能力,通过modify方法或setDate就能准确处理闰年问题。
<?php
// 创建当前日期的DateTime对象
$today = new DateTime();
// 修改年份为去年,月份和日保持不变
$today->modify('-1 year');
// 输出格式化后的去年今日日期
echo $today->format('Y-m-d');
?>
上面的代码会自动处理如2月29日这类特殊情况,如果今年是2024年2月29日,得到的将是2023年2月28日。
使用strtotime函数
strtotime支持自然语言式的相对时间描述,写起来更简洁。
<?php
// 获取去年今日的Unix时间戳
$lastYearTimestamp = strtotime('-1 year');
// 格式化为日期字符串
$lastYearDate = date('Y-m-d', $lastYearTimestamp);
echo $lastYearDate;
?>
指定日期求去年同日
如果要对某个给定日期而不是今天求去年同日,可以结合createFromFormat使用。
<?php
// 从指定日期字符串创建对象
$date = DateTime::createFromFormat('Y-m-d', '2023-03-15');
// 减去一年
$date->modify('-1 year');
echo $date->format('Y-m-d'); // 输出2022-03-15
?>
方法对比
| 方式 | 优点 | 适用场景 |
|---|---|---|
| DateTime类 | 面向对象,可读性好,时区支持完善 | 复杂日期运算、框架内使用 |
| strtotime | 代码简短,写法灵活 | 快速脚本、简单计算 |
注意事项
- 使用
date_default_timezone_set()设置正确时区,避免服务器默认时区导致偏差 - 涉及跨年统计时,建议统一用日期字符串比较而非时间戳,减少边界错误
- 不要手动用秒数减365天,因为平年闰年天数不同
通过上述技巧,你可以稳健地在PHP中获取去年今日日期,不必担心日期边界问题。