Самый простой метод должен был бы создать цикл от даты начала до даты окончания (вы должны тайному как к отметкам времени через mktime, а затем добавить день (86400 секунд) для увеличения). Во внутренней части петли, вы бы преобразовать каждую дату в метку времени Unix (еще раз через mktime и т.д.), а затем использовать ...
date('N', $dayStamp)
... чтобы получить день недели на указанную дату.
В качестве основного РЕАЛИЗАЦИЯ, это будет выглядеть так:
<?php
function getWorkingDays($startDate, $endDate) {
$businessDays = array();
$businessDaysInWeek = range(1,5); // Only Monday to Friday
// Decompose the provided dates.
list($startYear, $startMonth, $startDay) = explode('-', $startDate);
list($endYear, $endMonth, $endDay) = explode('-', $endDate);
// Create our start and end timestamps.
$startStamp = mktime(1, 1, 1, $startMonth, $startDay, $startYear);
$endStamp = mktime(1, 1, 1, $endMonth, $endDay, $endYear);
// Check each day in turn.
for($loop=$startStamp; $loop<=$endStamp; $loop+=86400) {
if(in_array(date('N', $loop), $businessDaysInWeek)) {
// You'll also want to omit bank holidays, etc. in here.
$businessDays[] = date('Y-m-d', $loop);
}
}
return $businessDays;
}
print_r(getWorkingDays('2011-01-10', '2011-01-24'));
?>
Однако вы, скорее всего, также необходимо исключить праздники банка и т.д., так что вы должны хранить такие исключения в таблице базы данных/lookup array и т. д., чтобы проверить их по мере необходимости.
Кстати, если вы используете версию PHP раньше 5.1.0, вы должны использовать date('w'...
и соответственно настроить свои дни недели. (Это ведет отсчет от нуля вместо одного.)
, что квалифицируется как рабочий день (только пн-пт, или другие дни тоже исключены?) – Hamish