Php добавить 5 рабочих дней к текущей дате, исключая выходные (суббота) и исключая (несколько) праздников

Для доставки нашего интернет-магазина нам нужно рассчитать 5 рабочих дней с текущей даты в php.

Наши рабочие дни с понедельника по пятницу, и у нас есть несколько выходных (выходных), которые также не могут быть включены.

Я нашел этот сценарий, но это не относится к праздникам.

<?php

$_POST['startdate'] = date("Y-m-d");
$_POST['numberofdays'] = 5;

$d = new DateTime( $_POST['startdate'] );
$t = $d->getTimestamp();

// loop for X days
for($i=0; $i<$_POST['numberofdays']; $i++){

// add 1 day to timestamp
$addDay = 86400;

// get what day it is next day
$nextDay = date('w', ($t+$addDay));

// if it's Saturday or Sunday get $i-1
if($nextDay == 0 || $nextDay == 6) {
$i--;
}

// modify timestamp, add 1 day
$t = $t+$addDay;
}

$d->setTimestamp($t);

echo $d->format('Y-m-d'). "\n";

?>

-2

Решение

Вы можете использовать «пока заявление», цикл до получения 5 дней достаточно. Каждый раз получая петли & отметьте один следующий день в списке праздников или нет.

Вот пример:

$holidayDates = array(
'2016-03-26',
'2016-03-27',
'2016-03-28',
'2016-03-29',
'2016-04-05',
);

$count5WD = 0;
$temp = strtotime("2016-03-25 00:00:00"); //example as today is 2016-03-25
while($count5WD<5){
$next1WD = strtotime('+1 weekday', $temp);
$next1WDDate = date('Y-m-d', $next1WD);
if(!in_array($next1WDDate, $holidayDates)){
$count5WD++;
}
$temp = $next1WD;
}

$next5WD = date("Y-m-d", $temp);

echo $next5WD; //if today is 2016-03-25 then it will return 2016-04-06 as many days between are holidays
4

Другие решения

Функция, основанная на ответе Тинь Данга:

function getFutureBusinessDay($num_business_days, $today_ymd = null, $holiday_dates_ymd = []) {
$num_business_days = min($num_business_days, 1000);
$business_day_count = 0;
$current_timestamp = empty($today_ymd) ? time() : strtotime($today_ymd);
while ($business_day_count < $num_business_days) {
$next1WD = strtotime('+1 weekday', $current_timestamp);
$next1WDDate = date('Y-m-d', $next1WD);
if (!in_array($next1WDDate, $holiday_dates_ymd)) {
$business_day_count++;
}
$current_timestamp = $next1WD;
}
return date('Y-m-d', $current_timestamp);
}

Я сделал это ограничить цикл до 1000 рабочих дней. Там не может быть никаких ограничений при желании.

3

По вопросам рекламы [email protected]