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
相关产品推荐
相关产品推荐

