>我正在尝试获取本周所有工作日的日期范围。为此,我编写了以下代码。
法典
$begin = new DateTime('monday this week'); 2016-07-04
$end = clone $begin;
$end->modify('next friday'); // 2016-07-08
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);
foreach($daterange as $date) {
echo $date->format('Y-m-d')."<br />";
}
输出
- 2016年07月04 日
- 2016年07月05 日
- 2016年07月06 日
- 2016年07月07日
在输出中缺少星期五。我可以通过$end->modify('next saturday')
来解决这个问题,但我想知道为什么DatePeriod
的最后一天不包括在该范围内。
迭代器似乎检查时间和日期,如果 endDate 中的时间小于或等于开始日期中的时间,它会排除结束元素。
因此,请确保结束日期的时间至少比开始日期的时间大一秒。
// this will default to a time of 00:00:00
$begin = new DateTime('monday this week'); //2016-07-04
$end = clone $begin;
// this will default to a time of 00:00:00
$end->modify('next friday'); // 2016-07-08
$end->setTime(0,0,1); // new line
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);
foreach($daterange as $date) {
echo $date->format('Y-m-d')."<br />";
}
试试这段代码
<?php
$begin = new DateTime('2016-07-04');
$end = clone $begin;
$end->modify('next friday'); // 2016-07-08
$end->modify('+1 day');
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);
foreach ($daterange as $date) {
echo $date->format('Y-m-d') . PHP_EOL;
}
在 PHP 8.2 中,您可以使用 DatePeriod::INCLUDE_END_DATE
作为构造函数选项!
https://www.php.net/manual/en/class.dateperiod.php#dateperiod.constants.include-end-date