2017-07-24 127 views
11

我试图将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

+1

我已经通过你的问题读几次,不明白你所需的输出。我非常确定,如果你给出你想要的输出的例子,我可以做到这一点。 –

+0

检查我的更新,我提供了一个例子。我希望这是有道理的 – charlie

+0

让你的脚本返回日期+ 2天。 做一个“假期检查”,看看你的假期数组中是否有新的日期。如果确实如此,那就给它添加一天。 然后你只需要验证它是否是一个工作日。如果生成的日期是星期六或星期日,则在日期中添加1天,然后重新运行整个事情(从假日检查开始)。 听起来像你有理论上已经?只需使用'in_array()'方法即可。 –

回答

12

你可以做一些简单的操作,如使用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

当OP想要添加周日时,此解决方案正在增加'+1天' – BeetleJuice

+0

好点。固定。 – fubar

+0

哇。我永远不会想到这样做。 +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); 
+0

感谢您将它放在一起 - 它似乎会返回正确的日期,但我实际上在另一个函数中运行此内容,我认为它导致一个问题返回2个函数内的值 - 这可能会导致一个问题? – charlie

+0

你的第二个功能是什么?返回仅仅意味着函数的值是返回中的任何值。您可以根据需要嵌套许多功能。告诉我你有什么,我可以告诉你如何使它工作。 –