Функция расчета даты по рабочим дням.

Делитесь своими плагинами и темами оформления.
Ответить
alexinc
Сообщения: 391
Зарегистрирован: 03 мар 2022, 21:40
Имя: Alex
Откуда: Россия
Контактная информация:

Функция расчета даты по рабочим дням.

Сообщение alexinc »

Пришлось тут повозиться с датами. Стояла задача: от будущей даты рассчитать назад дату по рабочим дням, исключая выходные и праздники.
То есть:
Есть 1 сентября, оттуда нужно отнять 64 рабочих дня(то есть исключить субботы и воскресения + праздничные дни).
Итак. Таблица праздников есть в системе (правда, даты там оказались не в timestamp). Дни недели зашиты в php и компе. Размещаем данную функцию в пользовательских PHP скриптах.
Поехали:

Код: Выделить всё

function getFutureBusinessDay($num_business_days, $today_ymd = null, $count_day = '+1') {
    $business_day_count = 0;
    $current_timestamp = empty($today_ymd) ? time() : strtotime($today_ymd);
    while ($business_day_count < $num_business_days) {
          $next1WD = strtotime($count_day.' weekday', $current_timestamp);
          $next1WDDate = date('Y-m-d', $next1WD);
          $select_holy_query_db=db_query("select id from app_holidays where '".$next1WDDate."' BETWEEN start_date and end_date");
          if (!db_fetch_array($select_holy_query_db)) {
                 $business_day_count++;
          }
    $current_timestamp = $next1WD;
    }
    return $current_timestamp;
}
Возможно, написано коряво, но работает.
На вход даем 3 переменные:
Кол-во рабочих дней, нужную дату в формате "Год-месяц-день", направление счета - от даты вверх,от даты вниз. Последние два параметра можно не указывать, тогда по умолчанию будет текущая дата, счет всегда вверх.
На выходе получаем timestamp нужной даты.
Можно адаптировать на запрос из интернета, но у меня часто попадается закрытый контур, и проще забить в базу даты.
Буду рад, если кому пригодиться.
Спасибо.
alexinc
Сообщения: 391
Зарегистрирован: 03 мар 2022, 21:40
Имя: Alex
Откуда: Россия
Контактная информация:

Re: Функция расчета даты по рабочим дням.

Сообщение alexinc »

Для онлайн проверки можно использовать сервис https://www.isdayoff.ru
API производственного календаря

Проверка даты на принадлежность к нерабочему дню, согласно официальным указам и распоряжениям.
Поддерживает:
Беларусь(by),Казахстан (kz),Россия (ru),Украина (ua),США (us),Узбекистан (uz),Турция (tr),Латвия (lv).
Для тех, кто использует полный онлайн
Ответить