2017-07-24 164 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

你的第二個功能是什麼?返回僅僅意味着函數的值是返回中的任何值。您可以根據需要嵌套許多功能。告訴我你有什麼,我可以告訴你如何使它工作。 –