其他分享
首页 > 其他分享> > 减少日期间隔不产生结果

减少日期间隔不产生结果

作者:互联网

尝试获取最近的四个星期日,并从最近的星期日开始以一个循环递减.

// 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为例,我认为设置invert属性可以解决此问题,但是我无法使其正常工作.然后this comment in the PHP docs声称DatePeriod类甚至与负间隔都不兼容.有人在这个问题上有一些澄清吗?也许PHP文档可以在这里进行一些改进.

解决方法:

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');

有趣的是,这不会以invert = 1创建7天间隔.如果您使用var_dump($dateInterval),则会看到public’d’=> int -7和public’invert’=>整数0.

但是从技术上讲,您不需要DateInterval或DatePeriod即可完成此操作.

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

标签:php-7,dateinterval,php
来源: https://codeday.me/bug/20191109/2012869.html