2013-06-09 4 views
0

Итак, я искал поисковые запросы в Интернете, пытаясь найти какой-то PHP API, который прекрасно обрабатывает расчеты рабочих дней. Я нашел ряд answers and code snippets на stackoverflow, которые были полезны, но код, который я нашел, который обрабатывал добавление рабочих дней к данной дате, не имел определенных функций, которые мне нужны (например, обработка праздников, которые выпадают на выходные), и было сложно настроить на основе потребностей конкретного приложения.PHP-класс для расчета рабочих дней

Итак, я, наконец, решил укусить пулю и написать собственное решение. Класс, который я выпустил, включает код, который я нашел в stackoverflow (James Pasta++), а также логику, используемую в аналогичном (и более простом) классе Java, который я написал в прошлом году. Я размещаю его здесь Q/A style, если кто-то еще сталкивается с теми же разочарованиями, которые у меня были с этой концепцией, и находит это полезным решением.

Есть две основные проблемы, с которыми я столкнулся: 1) добавление рабочих дней к предоставленной дате и 2) подсчет рабочих дней между двумя датами. Моими основными проблемами в решении этих проблем были простота использования и расширяемость; существует ряд мест, которые были написаны менее эффективно; если это станет проблемой, я могу, конечно, реорганизовать части кода, но, по крайней мере, для моих целей, я не буду рассчитывать тысячи рабочих дней в будущем :-)

Пример кода и ссылки на источник могут можно найти в ответе ниже. Обратная связь и улучшения более чем приветствуются.

ответ

0

The Code

Основная концепция этой библиотеки является то, что дата обернута с объектом Businessday; он может затем сравнивать() d с другими датами или может иметь рабочие дни add() ed или subtract() ed. Все даты, предоставляемые библиотеке, могут быть одним из следующих четырех типов: строка даты, принятая strtotime(), отметка времени UNIX, другой объект BusinessDay или null (представляет текущее время).

Объекты BusinessDay могут быть созданы через новый оператор или с помощью функции wrapBusinessDay(). Использование последней опции позволяет связывать метод при создании экземпляра, что может помочь сохранить код кратким. См. Пример кода ниже.

Пример кода:

// add a business day to today 
$ship_date = wrapBusinessDay(time())->add(1); 

// find # of business days until required date 
$required_date = '6/24/2013'; 
$difference = $ship_date->difference($required_date); 

// panic?! 
if ($difference < 10) { 
    echo "Uh-oh, we'll need expedited shipping!\n"; 
} else { 
    echo "Whew! we're safe.\n"; 
} 

// specify custom holidays 
$arr_matey = wrapBusinessDay('2013-09-18', array(
    '2013-09-19' 
))->add(1); 

// specify custom formats 
echo $arr_matey . "\n";      // prints '2013-09-20 00:00:00' 
echo $arr_matey->dateFormat('m~d~Y') . "\n"; // prints '09~20~2013' 

Там больше к библиотеке, но это суть его. Надеюсь, это спасет кого-нибудь еще! ~ Nate

+0

Очень хорошо .. но это решение не учитывает праздники по выходным дням, которые наблюдаются в будние дни ... FYI – EGriff