Задать вопрос
ragnar_ok
@ragnar_ok

Как вычислить разницу дат в рабочих днях?

Дан инфоблок со свойствами "Дата начала" и "Дата окончания" (тип "Дата"). Как для элемента этого инфоблока получить разницу в рабочих днях (не праздничных, не выходных)? Поможет ли модуль Календарь событий?

<?php
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a дней'); // в рабочих днях
  • Вопрос задан
  • 336 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
myks92
@myks92 Куратор тега PHP
Нашёл решение — пометь вопрос ответом!
Вам нужно создать свой Производственный календарь.

Производственный календарь – это специальный календарь, который составлен с учетом праздников и выходных дней на текущий год. Он составляется на основе постановлений правительства Российской Федерации. На основании этого календаря специалисты кадровых служб составляют рабочие графики, определяют число рабочих часов за месяц и начисляют заработную плату. Производственный календарь показывает достоверную и точную информацию о том, какие дни являются выходными, праздничными, либо сокращенными рабочими.

Данные можно хранить в базе данных в виде таблицы holidays (Календарь праздничных и переносимых дней). Пример. Чтобы не придумывать велосипед и каждый раз вбивать эти дни, то в интернете есть много решений, которые предоставляют эти данные:

  1. Открытые данные России. Скачиваете последнюю версию, пишите свой конвектор, записываете к себе в базу. Имеется готовый парсер.
  2. isDayOff() - публичный api по Производственному календарю. Вы можете передать дату и получить всю информацию. Пример: Получение данных за год.
  3. Xmlcalendar - Производственный календарь в виде XML. Имеется готовый парсер 1 и парсер 2.
  4. Консультант плюс - Производственный календарь. Имеется готовый парсер 1, парсер 2 и парсер 3.


В конечном итоге, на основе этих данных вы можете выводить: календарь, статистику и информацию о нерабочих днях, основываясь на ваших данных. Пример. А так же применять различные фильтры и выборку дней.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы