Спасибо Бобине, МакГрэйму, Тони, Джеймсу Пасте и нескольким другим, которые разместили здесь. Я написал свою собственную функцию для добавления рабочих дней к дате, но изменил ее с помощью некоторого кода, который я нашел здесь. Это будет обрабатывать дату начала на выходные / праздничные дни. Это также будет обрабатывать рабочие часы. Я добавил несколько комментариев и разбил код, чтобы его было легче читать.
<?php
function count_business_days($date, $days, $holidays) {
$date = strtotime($date);
for ($i = 1; $i <= intval($days); $i++) { //Loops each day count
//First, find the next available weekday because this might be a weekend/holiday
while (date('N', $date) >= 6 || in_array(date('Y-m-d', $date), $holidays)){
$date = strtotime(date('Y-m-d',$date).' +1 day');
}
//Now that we know we have a business day, add 1 day to it
$date = strtotime(date('Y-m-d',$date).' +1 day');
//If this day that was previously added falls on a weekend/holiday, then find the next business day
while (date('N', $date) >= 6 || in_array(date('Y-m-d', $date), $holidays)){
$date = strtotime(date('Y-m-d',$date).' +1 day');
}
}
return date('Y-m-d', $date);
}
//Also add in the code from Tony and James Pasta to handle holidays...
function getNationalAmericanHolidays($year) {
$bankHolidays = array(
'New Years Day' => $year . "-01-01",
'Martin Luther King Jr Birthday' => "". date("Y-m-d",strtotime("third Monday of January " . $year) ),
'Washingtons Birthday' => "". date("Y-m-d",strtotime("third Monday of February " . $year) ),
'Memorial Day' => "". date("Y-m-d",strtotime("last Monday of May " . $year) ),
'Independance Day' => $year . "-07-04",
'Labor Day' => "". date("Y-m-d",strtotime("first Monday of September " . $year) ),
'Columbus Day' => "". date("Y-m-d",strtotime("second Monday of October " . $year) ),
'Veterans Day' => $year . "-11-11",
'Thanksgiving Day' => "". date("Y-m-d",strtotime("fourth Thursday of November " . $year) ),
'Christmas Day' => $year . "-12-25"
);
return $bankHolidays;
}
//Now to call it... since we're working with business days, we should
//also be working with business hours so check if it's after 5 PM
//and go to the next day if necessary.
//Go to next day if after 5 pm (5 pm = 17)
if (date(G) >= 17) {
$start_date = date("Y-m-d", strtotime("+ 1 day")); //Tomorrow
} else {
$start_date = date("Y-m-d"); //Today
}
//Get the holidays for the current year and also for the next year
$this_year = getNationalAmericanHolidays(date('Y'));
$next_year = getNationalAmericanHolidays(date('Y', strtotime("+12 months")));
$holidays = array_merge($this_year, $next_year);
//The number of days to count
$days_count = 10;
echo count_business_days($start_date, $days_count, $holidays);
?>