如何在PHP中动态获取过去数月、周、年或天的日期?
动态获取PHP中过去N天/周/月/年的日期范围
嘿,看到你已经有了获取过去30天日期的基础代码,想要把它改成更动态的版本完全没问题!咱们来一步步调整,让代码能灵活支持你需要的各种时间段。
首先得纠正一个小误区:你提到的strtotime('from today to 3 months')写法不太对,strtotime的语法里,要表示“过去的N个单位时间”,应该用today - X [单位]的格式,比如today - 3 months,而不是from today to这种表述。
基础版:直接用strtotime实现不同时间段
先给你几个直接可用的示例,对应你需要的场景:
- 过去3天:
echo date('Y-m-d') . ' - ' . date('Y-m-d', strtotime('today - 3 days')); - 过去3周:
echo date('Y-m-d') . ' - ' . date('Y-m-d', strtotime('today - 3 weeks')); - 过去3个月:
echo date('Y-m-d') . ' - ' . date('Y-m-d', strtotime('today - 3 months')); - 过去3年:
echo date('Y-m-d') . ' - ' . date('Y-m-d', strtotime('today - 3 years'));
进阶版:封装成动态函数
如果要更灵活,不用每次重复写代码,咱们可以把逻辑封装成一个函数,只需要传入数量和单位就能得到结果:
function getPastDateRange($quantity, $unit) { // 先验证单位是否合法,避免错误 $validUnits = ['days', 'weeks', 'months', 'years']; if (!in_array($unit, $validUnits)) { return '无效的时间单位,请传入days/weeks/months/years'; } $endDate = date('Y-m-d'); // 拼接strtotime的参数 $startDate = date('Y-m-d', strtotime("today - {$quantity} {$unit}")); return "{$endDate} - {$startDate}"; } // 调用示例 echo getPastDateRange(3, 'days'); // 输出:当前日期 - 3天前的日期 echo getPastDateRange(2, 'years'); // 输出:当前日期 - 2年前的日期 echo getPastDateRange(7, 'weeks'); // 输出:当前日期 - 7周前的日期
更可靠的方案:使用DateTime类
如果需要处理更复杂的日期场景(比如跨年月的边界情况,比如3月31日减1个月),推荐使用PHP的DateTime类,它的日期处理更严谨:
function getPastDateRangeWithDateTime($quantity, $unit) { $unitMap = [ 'days' => 'D', 'weeks' => 'W', 'months' => 'M', 'years' => 'Y' ]; if (!isset($unitMap[$unit])) { return '无效的时间单位,请传入days/weeks/months/years'; } $endDate = new DateTime(); // 使用DateInterval来减去指定时间 $startDate = (new DateTime())->sub(new DateInterval("P{$quantity}{$unitMap[$unit]}")); return $endDate->format('Y-m-d') . ' - ' . $startDate->format('Y-m-d'); } // 调用示例 echo getPastDateRangeWithDateTime(3, 'months');
这里的DateInterval格式是P[数量][单位],比如P3M代表3个月,P2Y代表2年,它会自动处理像3月31日减1个月变成2月最后一天这种边界情况,比strtotime更可靠。
小提示
不管用哪种方法,PHP都会自动处理日期的边界问题,不用担心出现类似“2月30日”这种无效日期的情况~
内容的提问来源于stack exchange,提问作者KD.S.T.
相关产品推荐
相关产品推荐

