减少DateInterval不产生结果

时间:2018-02-16 19:27:21

标签: php php-7 dateinterval

尝试获取最后四个星期日,从最近的星期日开始循环递减。

// most recent sunday
$mostRecentSunday = new DateTime('last sunday');

// four Sundays ago
$maxDateAttempt = clone $mostRecentSunday;
$maxDateAttempt->modify('-4 weeks');

// interval of one week (same as 7 days or "P7D")
$dateInterval = new DateInterval('P1W');

// isn't this supposedly supposed to switch the increasing interval to decreasing?
$dateInterval->invert = 1;

$dateRange = new DatePeriod($mostRecentSunday, $dateInterval, $maxDateAttempt);

foreach ($dateRange as $day) {
    echo $day->format('F j, Y');
}

考虑@hijarian's answer in this similar question,我认为设置反转属性可以解决这个问题,但我无法让它工作。然后this comment in the PHP docs声称DatePeriod类甚至与负间隔不兼容。任何人都清楚这个问题吗?也许PHP文档可以在这里使用一些改进。

1 个答案:

答案 0 :(得分:3)

PHP文档中的注释只是部分正确。到目前为止,我所阅读和试验的所有内容似乎都表明DatePeriod在使用结束日期时无法使用负DateIntervals 。也许有一些初步检查,在它做任何事情之前,最小值小于最大值,但我真的不确定它为什么不起作用。

但是,如果您使用重复constructor而不是设置结束日期,则 可以正常工作。

$dateRange = new DatePeriod($mostRecentSunday, $dateInterval, 3);
// using 3 rather than 4 because the initial value is one occurrence

但你必须改为创建你的DateInterval

$dateInterval = DateInterval::createFromDateString('-1 week');

有趣的是,这不会产生7天的间隔,其中invert = 1。如果您var_dump($dateInterval),则会看到public 'd' => int -7public 'invert' => int 0

但从技术上讲,您不需要DateInterval或DatePeriod来完成此任务。

for ($i=0, $date = new DateTime; $i < 4; $i++) {
    echo $date->modify('last sunday')->format('F j, Y');
}