Как получить временные интервалы на определенную дату

Надеюсь, у всех все хорошо. Мне нужно распечатать массив как временные интервалы.

Предположим, что есть 2 заказа на 2021.11.15 на 11:30am to 12:00pm а также 2:00pm to 4:15pm.

Мой заказ должен быть выполнен. Поэтому временные интервалы должны быть промежуточными. 8:00am and 6:00pm пропуск тех времен для уже существующих заказов.

Мои ожидаемые результаты должны быть:

      array:2 [
  0 => array:2 [
    "start" => "08:00:00"
    "end" => "9:30:00"
  ]
  1 => array:2 [
    "start" => "09:30:00"
    "end" => "11:00:00"
  ]
  2 => array:2 [
    "start" => "12:00:00"
    "end" => "13:30:00"
  ]
  3 => array:2 [
    "start" => "16:15:00"
    "end" => "17:45:00"
  ]
]

Следующая строка используется для получения объекта существующих заказов с их временем начала и окончания.

      $existOrders = $this->orderHasPropartnerService->getOrderExistForDateProPartner($proPartnerDefaultLocation->id, $selectedDateRecord->date);

Потом просто зациклил.

      if ($existOrders->count() > 0) {
                $dateStartTime = $selectedDateRecord->time_from;
                $x = 0;

                $firstEndingTime = Carbon::parse($dateStartTime)->addMinutes($totalTimeToOrder)->format('H:i:s');

                foreach ($existOrders as $key1 => $existOrder1) {

                    if ($existOrder1->order->time_slot_from < $firstEndingTime && $existOrder1->order->time_slot_to >= $firstEndingTime) {
                        $timeCheckArray[$x]['start'] = $existOrder1->order->time_slot_to;
                        $timeCheckArray[$x]['end'] = Carbon::parse($existOrder1->order->time_slot_to)->addMinutes($totalTimeToOrder)->format('H:i:s');
                    } else {
                        $timeSlotArray[$x]['start'] = $dateStartTime;
                        $timeSlotArray[$x]['end'] = $firstEndingTime;

                        $timeCheckArray[$x]['start'] = $firstEndingTime;
                        $timeCheckArray[$x]['end'] = Carbon::parse($firstEndingTime)->addMinutes($totalTimeToOrder)->format('H:i:s');
                    }

                    if (isset($existOrders[$key1+1])) {
                        if ($existOrders[$key1+1]->order->time_slot_from < $timeCheckArray[$x]['end'] && $existOrders[$key1+1]->order->time_slot_to >= $timeCheckArray[$x]['end']) {

                        } else {
                            $timeSlotArray[$x+1]['start'] = $timeCheckArray[$x]['start'];
                            $timeSlotArray[$x+1]['end'] = $timeCheckArray[$x]['end'];
                        }
                    }
                }
            }

Что касается приведенного выше примера $dateStartTime будет 8:00am. Значение $totalTimeToOrder будет 1h 30m.

Когда я пытаюсь напечатать $timeSlotArray это приведет к следующему:

      array:2 [
  0 => array:2 [
    "start" => "08:00:00"
    "end" => "09:30:00"
  ]
  1 => array:2 [
    "start" => "08:00:00"
    "end" => "09:30:00"
  ]
]

Будет очень признательно, если кто-нибудь укажет мне, где я сделал ошибки в этой логике. Большое вам спасибо, ребята, за ваше драгоценное время для решения моей проблемы.

1 ответ

Наилучшим подходом было бы запустить цикл for для проверки того, что новый заказ не попадает между забронированными временами.

Попробуйте что-то подобное, преобразовав его в объект PHP Date

      $NewOrder= "4:59 pm";
$start= "5:42 am";
$end= "6:26 pm";

$date1 = DateTime::createFromFormat('h:i a', $NewOrder);
$date2 = DateTime::createFromFormat('h:i a', $start);
$date3 = DateTime::createFromFormat('h:i a', $end);
if ($date1 > $date2 && $date1 < $date3)
{
   echo 'Not safe to add it ';
}
Другие вопросы по тегам