首页 > 解决方案 > 如何获取两个日期之间所有星期一的日期,但仅在 PHP 范围内获取整个星期的日期?

问题描述

示例:$startDate 是 2021 年 6 月 20 日星期日,$endDate 是 2021 年 7 月 7 日星期三。然后我希望它列出:

Monday 2021-06-21
Monday 2021-06-28

但不是星期一 2021-07-05,因为整个(星期一到星期日)周不在范围内。我想我需要在范围内找到最后一个星期日并将该日期用作 endDate。

标签: phpdate

解决方案


一种可能的方法:

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 对象,从 $start 和 $end 日期创建,间隔为 1 天,用 foreach 迭代;每个星期一的日期都存储在一个数组中。如果 endDate 不是星期日,最后一步是丢弃该数组的最后一项。


推荐阅读