php - 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";
}
- 2021-07-31
- 2021-08-07
- 2021-08-14
- 2021-08-21
- 2021-08-28
我希望这个列表颠倒过来。所以我想我可以利用这处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;
}
解决方案
推荐阅读
- reactjs - Typescript - 前端输入 api 返回是一个好习惯
- php - 在 Laravel 验证中通过 required_unless 时如何保释
- sql-server - ')' 附近的 CTE 语法不正确
- javascript - Cytoscape.js:将节点事件设置为“否”后将其恢复为“是”
- angular - 角度材料自动完成过滤器不起作用
- c# - EPPlus SUMIFS 返回值 #VALUE
- python - 在 tkinter 中管理用户输入小部件
- html - 发送文件返回空白视频
- c++ - QtConcurrent::mapped 返回类型问题
- css - 字体真棒图标未显示 css 内容属性