Добавить перерыв в свободное время - PullRequest
0 голосов
/ 23 мая 2019

Блоки свободного времени PHP от даты начала и окончания

Я попытался получить эти блоки свободного времени исключительно из ответа, код работает нормально, но я не смог построить разрыв (интервал времени до временного интервала avaialbe).

Согласно этому ответу у меня возникла проблема с добавлением 30-минутного перерыва к доступному интервалу.следующий интервал, доступный через 30 мин. , указанный выше метод возвращает как,

10: 00 AM - 10:30 AM

10: 30 AM - 11:00 AM

11:00 - 11:30

11: 30 - 12:00

Ожидаемые результаты:

10: 00 утра - 10:30

10: 45 AM - 11:15

11: 30 AM - 12:00

Я хочу добавить время перерыва при запуске каждого временного интервала.

$meeting = array(array('start' => '2016-11-14 16:00:00',
                       'end'   => '2016-11-14 16:30:00'
                      ),
                 array('start' => '2016-11-14 16:45:00',
                       'end'   => '2016-11-14 20:00:00'
                      ),
                 array('start' => '2016-11-14 14:00:00',
                       'end'   => '2016-11-14 15:00:00'
                      ),
                 array('start' => '2016-11-14 13:00:00',
                       'end'   => '2016-11-14 14:00:00'
                      ),
                 array('start' => '2016-11-11 15:20:00',
                       'end'   => '2016-11-11 16:00:00'
                      ),
                 array('start' => '2016-11-11 14:00:00',
                       'end'   => '2016-11-11 15:00:00'
                      ),
                 array('start' => '2016-11-07 07:00:00',
                       'end'   => '2016-11-09 15:00:00'
                      )
               );
$min = "09:00:00";
$max = "17:00:00";
$start = "2030-01-01 00:00:00";
$end = "2000-01-01 00:00:00";
$free = [['start' => "2000-01-01 00:00:00", 'end' => "2030-01-01 00:00:00"]];
foreach($meeting as $m){
    foreach($free as $k=>$f){
        if($m['start']>$f['start'] && $m['start']<=$f['end']){
            $free[$k]['end'] = $m['start'];
            if($m['end']<$f['end'])
                $free[] = ['start'=>$m['end'], 'end'=>$f['end']];
        }
        elseif($m['end']<$f['end'] && $m['end']>$f['start']){
            $free[$k]['start'] = $m['end'];
        }
    }
    $start = min($start,$m['start']);
    $end = max($end,$m['end']);
}
$begin = new DateTime( $start );
$end = new DateTime( $end );

$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);

$daily_free = [];
foreach ( $period as $dt ){
    $m = [
        'start'=>date('Y-m-d ',strtotime($dt->format('Y-m-d').' -1 day')).$max,
        'end'=>$dt->format('Y-m-d ').$min
    ];
    foreach($free as $k=>$f){
        if($m['start']>$f['start'] && $m['start']<=$f['end']){
            $free[$k]['end'] = $m['start'];
            if($m['end']<$f['end'])
                $free[] = ['start'=>$m['end'], 'end'=>$f['end']];
        }
        elseif($m['end']<$f['end'] && $m['end']>$f['start']){
            $free[$k]['start'] = $m['end'];
        }
    }
}
foreach($free as $k=>$f){
    $s = explode(" ",$f['start']);
    $e = explode(" ",$f['end']);
    if($s[0] == $e[0]){
        $daily_free[$s[0]][] = ['start_free'=>$s[1], 'end_free'=>$e[1]];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...