Driver86
@Driver86
Немодератор toster.ru

Как в диапазоне дат посчитать рабочее кол-во времени?

Есть два unix timestamp:
$start = 123456789; // в прошлом
$finish = time(); // текущее

Как бы посчитать между ними кол-во секунд, но только в рабочее время.
Т.е. учесть секунды только между 07:00:00 и 22:45:00 включительно, и только с понедельника по пятницу включительно.
Какие есть идеи?
  • Вопрос задан
  • 282 просмотра
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Какие есть идеи?
Очень легко - нужно посчитать количество рабочих дней не включая первый и последний и умножить на количество секунд между 07:00:00 и 22:45:00. Потом, если первый день рабочий, прибавить количество секунд между началом этого дня (или 07:00:00, если таймстамп раньше) и 22:45:00. Потом, если последний день рабочий, прибавить количество рабочих секунд в нём.

Превратить таймстамп в дату, проверить на какой день недели выпадает эта дата и прибавить к дате день - это всё задачи простые.
Ответ написан
Комментировать
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Если не нужны праздники, высокосные секунды и вот это вот все, То я бы делал так:
1) Сначала привести времена начала и конца к одному и тому же времени суток.
Отмотайте время конца до полночи назад - прибавьте пересечение отрезка [0, end_time] c [7:00, 22:45] к ответу (если дата конца рабочая). Также отмотайте время начала вперед до полночи, также учитывая работчее время (если дата начала рабочая.
При этом к дате начала прибавьте 1, а от даты конца 1 вычтите. Отдельно рассомтрите случай, если даты начала и конца одинаковые.

Тут нужно будет по дате уметь определять рабочая ли она (получать день недели стандартной функцией).

2) Теперь осталось подсчитать, сколько рабочих дней между двумя датами (включая их). Я бы тупо вычел времена полдней этих дат друг из друга и поделил на 60*60*24 секунд, чтобы узнать сколько суток прошло. Теперь еще надо определить дни недели начала и конца.

Далее, также как с временем, отматываем дату начала до следующего понедельника, а дату начала до предыдущего воскресенья. Прибавляем к ответу (рабочее время в сутках)*(max(6-номер_дня_недели_начала, 0)+min(номер_дня_недели_конца, 5)). Теперь считаем сколько осталось полных недель (вычитаем сдвинутые даты друг из друга в днях и делим на 7) и прибавляем столько полных рабочих недель. Особый случай, если начало и конец в одной неделе (разница между ними <= 7-номер_дня_недели_начала).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы