在PHP中考虑工作日的日期范围之间找到子集

时间:2015-09-29 12:15:11

标签: php date subset

我实际上在寻找确切的解决方案,下面给出了一个 例如:

我需要每个给定日期范围的子集,具体取决于工作日
示例:
我有可用期限(即预订)的开始日期(2015-09-29)和结束日期(2015-11-01)。

我有多个签到日,多个结帐日期和日期间隔为7天:

像是一样 1.星期日到星期日 星期二到星期二 星期五到星期五。

所以简单语言的查询是:

2015-09-29至2015-11-01期间,如何获得基于上述签入/结帐的子集

 
 array(
        0 => array ('2015-09-29','2015-10-06')  // for tuesday to tuesday [first subset]
        1 => array ('2015-10-04','2015-10-11')  // sunday to sunday [first sunday]
        2 => array ('2015-10-02',2015-10-09)    // for friday to friday [first friday]
        3 => array ('2015-10-11',2015-10-18)    // for sunday to sunday [second sunday]
        3 => array ('2015-10-06',2015-10-13)    // for tueday to tuesday [second tuesday]
        so on ...    
    )

Thnx提前提出建议/建议

1 个答案:

答案 0 :(得分:1)

您可以使用DateTime

这是一个让你前进的工作示例:

function getRanges($start, $end, $weekdays) {
    $start = new DateTime($start);
    $end = (new DateTime($end))->modify('-6 days');
    $interval = new DateInterval('P1D');
    $period = new DatePeriod($start, $interval, $end);
    $ranges = [];
    foreach($period as $day) {
        if(in_array($day->format('w'), $weekdays)) {
            $ranges[] = [
                $day->format('Y-m-d'),
                $day->modify('+7 days')->format('Y-m-d')
            ];
        }
    }
    return $ranges;
}

$start = '2015-09-29';
$end = '2015-11-01';
$weekdays = [0,2,5]; // 0 = sunday, 1 = monday ...
$ranges = getRanges($start, $end, $weekdays);