示例:$startDate为2021-06-20周日,$endDate为2021:07-07周三。然后我想把它列出来:
Monday 2021-06-21
Monday 2021-06-28
但不是2021-07-05的星期一,因为整个星期一到星期日都不在这个范围内。我想我需要找到范围内的最后一个星期天,并将该日期用作endDate。
一种可能的方法:
function isMonday($date) {
return $date->format('N') === '1';
}
function isSunday($date) {
return $date->format('N') === '7';
}
function getMondays($start, $end) {
$mondays = [];
$datePeriod = new DatePeriod($start, new DateInterval('P1D'), $end);
foreach ($datePeriod as $date) {
if (isMonday($date)) $mondays[] = $date;
}
if (!isSunday($end)) array_pop($mondays);
return $mondays;
}
$startDate = new DateTime('2021-06-20');
$endDate = new DateTime('2021-07-07');
var_dump(getMondays($startDate, $endDate));
3v4l演示。它相当直接:有一个DatePeriod Traversable对象,它是从间隔为1天的$start和$end日期创建的,用foreach迭代;每个星期一的日期都存储在一个数组中。最后一步是,如果endDate不是Sunday,则丢弃该数组的最后一项。