Как получить временные интервалы на определенную дату
Надеюсь, у всех все хорошо. Мне нужно распечатать массив как временные интервалы.
Предположим, что есть 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 ';
}