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

PHP如何不转数组直接反转DatePeriod迭代器的日期序列

DatePeriod 直接倒序输出日期序列实现

我想实现不将DatePeriod迭代器的数据存入数组再反转的方式,直接倒序输出日期序列。

举个例子,我要获取最近5个周六的日期,使用以下代码可以输出从早到晚排序的日期列表:

$begin = new DateTime( date('Y-m-d', strtotime("last Saturday")));
$begin->modify("- 4 weeks");
$end = new DateTime( date('Y-m-d', strtotime("last Saturday")));
$end = $end->modify( '+1 day' );

$interval = new DateInterval('P1W');
$periods = new DatePeriod($begin, $interval ,$end);

foreach($periods as $date){
    echo $date->format("Y-m-d") . "\n";
}

运行后输出内容如下:

  • 2021-07-31
  • 2021-08-07
  • 2021-08-14
  • 2021-08-21
  • 2021-08-28

我想要将这个列表倒序输出,因此尝试调整起止日期、设置DateInterval的invert属性,调整后DatePeriod的起止参数和current元素看起来都正常,但遍历$period却没有返回任何结果,错误代码如下:

$begin = new DateTime( date('Y-m-d', strtotime("last Saturday")));
$begin = $begin->modify( '+1 day' );
$end = new DateTime( date('Y-m-d', strtotime("last Saturday")));
$end->modify("- 4 weeks");

$interval = new DateInterval('P1W');
$interval->invert = 1;

$periods = new DatePeriod($begin, $interval ,$end);

foreach($periods as $date){
    echo $date->format("Y-m-d") . "\n";
}

解决方案

我找到了一个可行的解决方案:通过计算日期差传入DatePeriod构造函数的重复次数参数,该方案可正常运行,注意需要将diff->days除以日期间隔天数,避免输出多余的日期:

$start = new \DateTime( date('Y-m-d', strtotime("last Saturday")));
$end = new DateTime( date('Y-m-d', strtotime("last Saturday")));
$end->modify("- 4 weeks");
$diff = $end->diff($start);
$interval = new \DateInterval('PT0S'); //0 duration
$interval->d = -7; //negative value

$period = new \DatePeriod($start, $interval, $diff->days / 7);
foreach ($period as $date) {
    echo $date->format('Y-m-d') . PHP_EOL;
}

内容的提问来源于stack exchange,提问作者atoms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:45:00