You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:08:58