Добавьте два рабочих дня в массив даты, исключая даты отпуска
Я пытаюсь добавить 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
Вы можете сделать что-то так же просто, как использовать цикл 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);
Ответ 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);
to
return nextBusinessDay(date('Y-m-d',strtotime($date.' +'.$daysToSkip.' day')), $daysToSkip,$holidays);