将两个工作日添加到日期数组中,不包括假日日期

时间:2017-07-24 22:26:22

标签: php date

我想在工作日添加2个日期,但我也想排除数组中的天数。

要排除的日期数组:

$bankHolidays = array();
foreach($obj as $e) {
    if($e->division == 'england-and-wales') {
        foreach($e->events as $events) {
            $bankHolidays[] = $events->date;
        }
    }
}

到目前为止增加2个工作日

$ret = date('d-m-Y', strtotime($bill["charge_customer_at"]. ' +2 weekdays'));

如何包含要排除的日期数组?

例如,如果我的日期为2017-07-19,并且我想添加2周工作日,则会输出2017-07-21

但如果2017-07-21在我的数组中,它应该跳过此日期并继续添加2个工作日,因此周末也会输出2017-07-24

2 个答案:

答案 0 :(得分:11)

你可以做一些简单的事情,比如使用while循环。

$date = '2017-07-25';
$reserved = ['2017-07-27', '2017-07-28'];
$days = 2;

while ($days > 0) {
    $date = date('Y-m-d', strtotime($date . ' +1 weekday'));
    if (! in_array($date, $reserved)) $days--;
}

var_dump($date);

答案 1 :(得分:2)

查找具有给定偏移量的下一个工作日功能。

以下内容基本上取决于您的给定日期,您想要跳过的天数,在您的案例2中,以及您在问题中显示时预先填充的假日数组。如果工作日在您的约会之后是如此之多,那么它会增加一天并再次检查。

function nextBusinessDay($date, $daysToSkip,$holidays){
    $day = date('Y-m-d',strtotime($date. ' + '.$daysToSkip.' weekday'));
    if(!in_array($day,$holidays)){
         return $day;
    } else {
        return nextBusinessDay(date('Y-m-d',strtotime($date.' +1 day')), $daysToSkip,$holidays);
    }
}

$date = '2017-07-19';
$holidays = ['2017-07-21'];
echo nextBusinessDay($date,2,$holidays);//returns 2017-07-24

$date = '2017-07-19';
$holidays = ['2017-07-21', '2017-07-24'];
echo nextBusinessDay($date,2,$holidays);//returns 2017-07-25 like if it were a 4 day weekend

抱歉,我花了一段时间才有机会查看并发布一些内容。这应该适合你。我的理解是,您需要返回自给定日期起两天的第一个营业日期,而不是在假日数组中添加两个工作日,直到日期为止。如果你真的想继续增加2天,或者多天,那就改变

return nextBusinessDay(date('Y-m-d',strtotime($date.' +1 day')), $daysToSkip,$holidays);

return nextBusinessDay(date('Y-m-d',strtotime($date.' +'.$daysToSkip.' day')), $daysToSkip,$holidays);