Мне нужен метод добавления «рабочих дней» в PHP. Например, пятница 12/5 + 3 рабочих дня = среда 12/10.
Как минимум, мне нужен код, чтобы понимать выходные дни, но в идеале он также должен учитывать федеральные праздники США. Я уверен, что смогу найти решение с помощью грубой силы, если это необходимо, но я надеюсь, что есть более элегантный подход. Кто угодно?
Спасибо.
Ответы:
Вот функция из комментариев пользователя на странице функции date () в руководстве по PHP. Это улучшенная функция в комментариях, которая добавляет поддержку високосных лет.
Введите даты начала и окончания, а также массив праздников, которые могут быть между ними, и он вернет рабочие дни в виде целого числа:
источник
Получите количество рабочих дней без выходных между двумя датами:
Пример использования:
Вывод:
Функция:
источник
$interval = DateInterval::createFromFormat('1 weekday');
я также рекомендую использовать$holidays = array_flip($holidays);
перед foreach иif isset($holidays[$period->format('Y-m-d')]);
уменьшить время обработки, необходимое для каждой итерации. Но рекомендую создать настраиваемую функцию для праздников, чтобы иметь возможность обрабатывать относительные праздники, такие какlast thursday of november
День благодарения или День труда,first monday of september
Есть несколько аргументов для функции date (), которые должны помочь. Если вы отметите дату («w»), вы получите номер дня недели от 0 для воскресенья до 6 для субботы. Так .. может что-то вроде ..
Это всего лишь примерный пример одной возможности ..
источник
Расчет отпуска нестандартен в каждом штате. Я пишу банковское приложение, для которого мне нужны жесткие бизнес-правила, но я все еще могу получить только приблизительный стандарт.
источник
источник
Вот функция для добавления рабочих дней к дате
В другом сообщении упоминается getWorkingDays (из комментариев php.net и включенных здесь), но я думаю, что он ломается, если вы начинаете в воскресенье и заканчиваете в рабочий день.
Используя следующее (вам нужно будет включить функцию getWorkingDays из предыдущего сообщения)
Дает результат 5, а не 4
Следующая функция была использована для создания вышеуказанного.
Принеси праздники ...
источник
Вы можете попробовать эту более простую функцию.
источник
Функция для добавления или вычитания рабочих дней из заданной даты без учета праздников.
использовать так ...
источник
Моя версия, основанная на работе @mcgrailm ... была изменена, потому что отчет нужно было просмотреть в течение 3 рабочих дней, а если он был отправлен в выходные, подсчет начнется в следующий понедельник:
И вычисляем разницу двух дат в рабочих днях:
В качестве примечания, все, кто использует 86400 или 24 * 60 * 60, пожалуйста, не ... время вашего забвения меняется с зимнего / летнего времени, когда день - это не ровно 24 часа. Хотя strtotime немного медленнее ('+ 1 день', $ timestamp), он намного надежнее.
источник
Грубая попытка определения рабочего времени - с понедельника по пятницу с 8 до 16:
источник
Ниже приведен рабочий код для расчета рабочих дней с заданной даты.
источник
Вот еще одно решение без цикла на каждый день.
источник
Для праздников создайте массив дней в каком-либо формате, который может выдавать date (). Пример:
Затем используйте функции in_array () и date (), чтобы проверить, соответствует ли временная метка празднику:
источник
У меня была такая же потребность, я начал с первого примера шпульки и закончил этим
кто-то
источник
!in_array($enddate,$holidays)
чтобы!in_array(date('Y-m-d',$enddate),$holidays)
при использовании массива праздника прошел в бобинах , как - В$holidays=array('2013-06-16','2013-07-12','2013-08-05');
противном случае вы проверяете массив полного дата для временной метки, которая всегда возвращает ложь.Вариант 1:
Вариант 2:
Вариант 3:
Дополнительные соображения по поводу праздников можно сделать, используя варианты вышеописанного, выполнив следующие действия. Заметка! убедитесь, что все метки времени относятся к одному и тому же времени суток (т.е. в полночь).
Сделайте массив праздничных дат (как unixtimestamps), то есть:
Изменить строку:
быть :
Готово!
источник
источник
Вот рекурсивное решение. Его можно легко изменить, чтобы отслеживать и возвращать только самую последнюю дату.
источник
источник
источник
рассчитать рабочие дни между двумя датами, включая праздники и индивидуальную рабочую неделю
Ответ не такой уж тривиальный - поэтому я предлагаю использовать класс, в котором вы можете настраивать больше, чем полагаясь на упрощенную функцию (или предполагая фиксированные языковой стандарт и культуру). Чтобы получить дату через определенное количество рабочих дней, вы:
Функциональный подход
источник
Это еще одно решение, оно почти на 25% быстрее, чем проверка праздников с помощью in_array:
источник
Этот фрагмент кода очень легко рассчитать рабочий день без выходных и праздников:
источник
Я знаю, что опаздываю на вечеринку, но я использую этот старый набор функций от Маркоса Дж. Монтеса для определения праздников и рабочих дней. Он нашел время, чтобы добавить алгоритм из 1876 года для Пасхи, и он добавил все основные праздники США. Это можно легко обновить для других стран.
источник
function get_business_days_forward_from_date ($ num_days, $ start_date = '', $ rtn_fmt = 'Ym-d') {
}
источник
В add_business_days есть небольшая ошибка. Попробуйте сделать следующее с существующей функцией, и результат будет в субботу.
Дата начала = Пятница. Рабочие дни для добавления = 1 Массив праздников = Добавить дату на следующий понедельник.
Я исправил это в своей функции ниже.
источник
Я просто заставляю свою функцию работать на основе кода Bobbin и mcgrailm, добавляя некоторые вещи, которые мне идеально подходят.
источник
Улучшение функции, предложенной Джеймсом Пастой выше, для включения всех федеральных праздников и исправления 4 июля (вычислено как 4 июня выше!), А также для включения названия праздника в качестве ключа массива ...
/ **
* Национальные американские праздники
* @param string $ year
* @return array
* /
public static function getNationalAmericanHolidays ($ year) {
}
источник
Только что закончили писать API, который можно использовать для управления рабочими днями (ни одно из этих решений не сработало в моей ситуации :-); ссылку на него здесь, если кто-то сочтет это полезным.
~ Нейт
Класс PHP для расчета рабочих дней
источник
Спасибо Bobbin, mcgrailm, Tony, James Pasta и некоторым другим, кто разместил здесь. Я написал свою собственную функцию для добавления рабочих дней к дате, но изменил ее с помощью кода, который я нашел здесь. Это будет обрабатывать дату начала, приходящуюся на выходные / праздничные дни. Это также касается рабочих часов. Я добавил несколько комментариев и разбил код, чтобы его было легче читать.
источник
Лично я считаю, что это более ясное и лаконичное решение:
Просто отправьте предложенную
new
дату в эту функцию.источник