Диапазон DateTime с «дырами» - PullRequest
0 голосов
/ 08 сентября 2018

Давайте предположим, что у нас есть «большой» диапазон даты и времени, например

$big = [
   'start' => '2018-09-01 00:00:00',
   'stop'  => '2018-09-01 23:59:59'
]

Мне нужно создать массив со всеми диапазонами, не включенными в другой массив, как показано ниже:

$exclude = [
   [
      'start' => '2018-09-01 12:00:00',
      'stop'  => '2018-09-01 14:59:59'
   ],
   [
      'start' => '2018-09-01 18:00:00',
      'stop'  => '2018-09-01 19:59:59'
   ]
]

чтобы полученная структура была примерно такой:

$results = [
   [
      'start' => '2018-09-01 00:00:00',
      'stop'  => '2018-09-01 11:59:59'
   ],
   [
      'start' => '2018-09-01 15:00:00',
      'stop'  => '2018-09-01 17:59:59'
   ],
   [
      'start' => '2018-09-01 20:00:00',
      'stop'  => '2018-09-01 23:59:59'
   ]
]

Т.Л., др

У меня большой диапазон дат (как и выше), и мне нужно создать результирующий диапазон, удалив один или несколько диапазонов из другой структуры. Что-то вроде извлечения рабочих перерывов из рабочего дня, сохраняя при этом только реальное рабочее время.

Я использую Carbon и Laravel, есть какое-то нативное решение для этого, или я должен разобрать всю конструкцию и сделать отверстия самостоятельно? Я не люблю изобретать велосипед.

1 Ответ

0 голосов
/ 14 сентября 2018

Я не знаю много об углероде, но я знаю, что Carbon расширяет собственный класс DateTime, поэтому следующий код может быть адаптирован для достижения вашей цели:

$result=[['start'=>$big['start'],'stop'=>''],['start'=>'','stop'=>''],['start'=>'','stop'=>$big['stop']]];//you can build this with a loop if you want...

foreach($result as $k =>$value){
    switch($k){
        case 0:

            $result[$k]['stop']=(($date=date_create($exclude[0]['start']))&&$date->sub(new dateInterval('PT1S')))?$date->format('Y-m-d H:i:s'):'';
            unset($date);
        break;
        case 1:
            $result[$k]['start']=(($date=date_create($exclude[0]['stop']))&&$date->add(new dateInterval('PT1S')))?$date->format('Y-m-d H:i:s'):'';
            $result[$k]['stop']=(($date=date_create($exclude[1]['start']))&&$date->sub(new dateInterval('PT1S')))?$date->format('Y-m-d H:i:s'):'';
            unset($date);
        break;
        case 2:
            $result[$k]['start']=(($date=date_create($exclude[1]['stop']))&&$date->add(new dateInterval('PT1S')))?$date->format('Y-m-d H:i:s'):'';
            unset($date);
        break;
        default:
        break;
    }
}
...