PHP класс для расчета рабочих дней
Так что я бродил по интернету, пытаясь найти какой-то PHP API, который бы хорошо обрабатывал подсчет рабочих дней. Я нашел несколько ответов и фрагментов кода для stackru, которые были полезны, но в коде, который я нашел, который обрабатывал добавление рабочих дней к определенной дате, не хватало определенных функций, которые мне нужны (например, обработка праздников, приходящихся на выходные), и было трудно настроить на основе потребностей данного приложения.
Поэтому я наконец решил укусить пулю и написать собственное решение. Созданный мной класс включает в себя код, который я нашел в stackru ( James Pasta ++), а также логику, используемую в аналогичном (и более простом) классе Java, который я написал в прошлом году. Я публикую его здесь в стиле Q/A на тот случай, если кто-то еще столкнется с теми же разочарованиями, что и я, с этой концепцией, и сочтет это полезным решением.
Я решил две основные проблемы: 1) добавление рабочих дней к указанной дате и 2) подсчет рабочих дней между двумя датами. Моими основными задачами при решении этих проблем были простота использования и расширяемость; Есть ряд мест, которые были написаны менее чем эффективно; если это станет проблемой, я, конечно, смогу провести рефакторинг частей кода, но, по крайней мере, для своих целей я не буду рассчитывать тысячи рабочих дней в будущем:-)
Пример кода и ссылку на источник можно найти в ответе ниже. Отзывы и улучшения приветствуются.
1 ответ
Основная концепция этой библиотеки заключается в том, что дата оборачивается объектом BusinessDay; затем его можно сравнить ()d с другими датами или добавить рабочие дни ed()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'
Есть еще кое-что в библиотеке, но это суть этого. Надеюсь, это сэкономит кому-то еще время! Нейт