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'

Есть еще кое-что в библиотеке, но это суть этого. Надеюсь, это сэкономит кому-то еще время! Нейт

Другие вопросы по тегам