@undefo

Как проверить, входит ли работа во временной период?

Привет!
Есть рабочий день 9:00-21:00.
Есть занятые промежутки времени с кратностью в 15 минут. Например, 10:00-10:15, 10:15-11:45, 12:30-16:00.
Есть работа, которая занимает определённое время. Например, 90 минут (или 1ч:30мин).
Нужно найти все возможные интервалы, куда помещается данная работа.

Из того, что приходит в голову: разбить рабочий день на массив интервалов по 15 минут (с помощью DatePeriod и DateInterval), в цикле пройтись по массиву, прибавляя к началу интервала время работы, и проверять конечное время на вхождение в занятые промежутки.
Но таких проверок будет довольно много, что скажется на производительности.

Может, есть какое-то более изящное решение?
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
<?php
$begin = new DateTime('09:00');
$end = new DateTime('21:00');
$intervals = array(
  array(new DateTime('10:00'), new DateTime('10:15')),
  array(new DateTime('10:15'), new DateTime('11:45')),
  array(new DateTime('12:30'), new DateTime('16:00'))
);
$time = 90;

function checkInterval($begin, $end, $time) {
  $intervalDiff = $begin->diff($end);
  $intervalMinutes = $intervalDiff->h * 60 + $intervalDiff->i;
  if ($intervalMinutes >= $time) {
    echo $begin->format('H:i'), ' - ', $end->format('H:i'), "\n";
  }
}

$intervalStart = $begin;
foreach ($intervals as $interval) {
  checkInterval($intervalStart, $interval[0], $time);
  $intervalStart = $interval[1];
}
checkInterval($intervalStart, $end, $time);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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