首页 > 解决方案 > PHP 对反转 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";
}

我希望这个列表颠倒过来。所以我想我可以利用这处DatePeriod invert房产。DatePeriod 的开始和结束看起来都是正确的,结果显示在current元素中。但是,interating over$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 构造函数中的 end 参数。这并不理想,但正在工作。请注意 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;
}

标签: php

解决方案


推荐阅读