本周我试图获取所有工作日的日期范围。我已经编写了以下代码来执行此操作。
$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 />";
}
在输出周五缺少。我可以通过执行$end->modify('next saturday')
来解决此问题,但我想知道为什么DatePeriod
的最后一天不包含在范围内。
答案 0 :(得分:20)
迭代器似乎检查时间和日期,如果endDate中的时间小于或等于开始日期的时间,则它会排除end元素。
因此,请确保结束日期的时间至少比开始日期的时间长一秒。
// 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 />";
}
答案 1 :(得分:7)
试试此代码
$begin = new DateTime('monday this week'); 2016-07-04
$end = clone $begin;
$end->modify('next friday'); // 2016-07-08
$end = $end->modify('+1 day');
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);