как включить разрывы временных интервалов с помощью DateTime

Я хочу создать временные интервалы с началом, временем окончания & также разбить начало и конец.
Я достиг генерации временных интервалов, но без перерыва между 11:10 — 11:25

ПРИМЕР ЖИВОГО КОДА

Входные переменные

$duration = 35; // how much the is the duration of a time slot
$cleanup    = 0; // don't mind this
$start    = '09:00'; // start time
$end      = '12:00'; // end time
$break_start = '11:10'; // break start
$break_end   = '11:25'; // break end

function availableSlots($duration, $cleanup, $start, $end) {
$start         = new DateTime($start);
$end           = new DateTime($end);
$interval      = new DateInterval("PT" . $duration . "M");
$cleanupInterval = new DateInterval("PT" . $cleanup . "M");
$periods = array();

for ($intStart = $start; $intStart < $end; $intStart->add($interval)->add($cleanupInterval)) {
$endPeriod = clone $intStart;
$endPeriod->add($interval);

if ($endPeriod > $end) {
break;
}

$periods[] = $intStart->format('H:i A') . ' - ' . $endPeriod->format('H:i A');
}return $periods;
}

Функция сгенерирует этот вывод:

09:00 AM - 09:35 AM
09:35 AM - 10:10 AM
10:10 AM - 10:45 AM
10:45 AM - 11:20 AM
11:20 AM - 11:55 AM

То, что мне нужно достичь, это 11:10 до 11:25, чтобы перерыв был исключен из результатов.

$break_start = '11:10';
$break_end   = '11:25';

1

Решение

Попробуй это…
Я изменил твою функцию

function availableSlots($duration, $cleanup, $start, $end, $break_start, $break_end) {
$start         = new DateTime($start);
$end           = new DateTime($end);
$break_start           = new DateTime($break_start);
$break_end           = new DateTime($break_end);
$interval      = new DateInterval("PT" . $duration . "M");
$cleanupInterval = new DateInterval("PT" . $cleanup . "M");
$periods = array();

for ($intStart = $start; $intStart < $end; $intStart->add($interval)->add($cleanupInterval)) {
$endPeriod = clone $intStart;
$endPeriod->add($interval);

if(strtotime($break_start->format('H:i A')) < strtotime($endPeriod->format('H:i A')) && strtotime($endPeriod->format('H:i A')) < strtotime($break_end->format('H:i A'))){
$endPeriod = $break_start;
$periods[] = $intStart->format('H:i A') . ' - ' . $endPeriod->format('H:i A');
$intStart = $break_end;
$endPeriod = $break_end;
$intStart->sub($interval);
}else{
$periods[] = $intStart->format('H:i A') . ' - ' . $endPeriod->format('H:i A');
}
}return $periods;
}

$duration = 35; // how much the is the duration of a time slot
$cleanup    = 0; // don't mind this
$start    = '09:00'; // start time
$end      = '12:00'; // end time
$break_start = '11:10'; // break start
$break_end   = '11:25'; // break end
availableSlots($duration, $cleanup, $start, $end, $break_start, $break_end);

Результатом будет:

Array
(
[0] => 09:00 AM - 09:35 AM
[1] => 09:35 AM - 10:10 AM
[2] => 10:10 AM - 10:45 AM
[3] => 10:45 AM - 11:10 AM
[4] => 11:25 AM - 12:00 PM
)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]