2013-08-09 3 views
1

У меня есть PHP-скрипт, который получает набор событий из базы данных с начала/конца DateTimes, которые представляют собой рабочее время.Split DateTime интервал до одного дня

Begin    | End 
2013-08-14 10:00:00 | 2013-08-22 09:30:00 
2013-08-08 07:00:00 | 2013-08-08 15:00:00 
2013-08-09 07:00:00 | 2013-08-10 07:00:00 

Теперь я хочу рассчитать, сколько было произведено каждый день. Для первой строки я хотел бы вывод так:

Begin    | End 
2013-08-14 10:00:00 | 2013-08-14 23:59:59 
2013-08-15 00:00:00 | 2013-08-15 23:59:59 
2013-08-16 00:00:00 | 2013-08-16 23:59:59 
.... 
2013-08-22 00:00:00 | 2013-08-22 09:30:00 

Я видел некоторые вещи с DatePeriod и DateInterval, но те не принимать во внимание время.

Благодарим за помощь.

+0

Эти даты хранятся в таблице базы данных mysql как временные метки, случайно? – Cups

ответ

5

DatePeriod и DateInterval Снимают время, поэтому вы можете использовать эти классы.

Данные:

$intervals = [ 
    ['begin' => '2013-08-14 10:00:00', 'end' => '2013-08-22 09:30:00'], 
    ['begin' => '2013-08-08 07:00:00', 'end' => '2013-08-08 15:00:00'], 
    ['begin' => '2013-08-09 07:00:00', 'end' => '2013-08-10 07:00:00'], 
]; 

функция быстрого Я писал:

function explodePeriodByDays($begin, $end) { 
    $days = []; 
    $dayInterval = new DateInterval('P1D'); 
    $begin = new DateTime($begin); 
    $end = new DateTime($end); 
    $_end = clone $end; 
    $_end->modify('+1 day'); 
    foreach ((new DatePeriod($begin, $dayInterval, $_end)) as $i => $period) { 
     $_begin = $period; 
     if ($i) $_begin->setTime(0, 0, 0); 
     if ($_begin > $end) break; 
     $_end = clone $_begin; 
     $_end->setTime(23, 59, 59); 
     if ($end < $_end) $_end = $end; 
     $days[] = [ 
      'begin' => $_begin, 
      'end' => $_end, 
     ]; 
    } 
    return $days; 
} 

Пример использования функции:

foreach ($intervals as $interval) { 
    echo "Day intervals from {$interval['begin']} to {$interval['end']} : \n"; 
    foreach (explodePeriodByDays($interval['begin'], $interval['end']) as $day) { 
     echo "\t {$day['begin']->format('Y-m-d H:i:s')} | {$day['end']->format('Y-m-d H:i:s')}\n"; 
    } 
    echo "\n"; 
} 

Вывод примера:

Day intervals from 2013-08-14 10:00:00 to 2013-08-22 09:30:00 : 
    2013-08-14 10:00:00 | 2013-08-14 23:59:59 
    2013-08-15 00:00:00 | 2013-08-15 23:59:59 
    2013-08-16 00:00:00 | 2013-08-16 23:59:59 
    2013-08-17 00:00:00 | 2013-08-17 23:59:59 
    2013-08-18 00:00:00 | 2013-08-18 23:59:59 
    2013-08-19 00:00:00 | 2013-08-19 23:59:59 
    2013-08-20 00:00:00 | 2013-08-20 23:59:59 
    2013-08-21 00:00:00 | 2013-08-21 23:59:59 
    2013-08-22 00:00:00 | 2013-08-22 09:30:00 

Day intervals from 2013-08-08 07:00:00 to 2013-08-08 15:00:00 : 
    2013-08-08 07:00:00 | 2013-08-08 15:00:00 

Day intervals from 2013-08-09 07:00:00 to 2013-08-10 07:00:00 : 
    2013-08-09 07:00:00 | 2013-08-09 23:59:59 
    2013-08-10 00:00:00 | 2013-08-10 07:00:00 
+0

Точно как я хотел, чтобы это было, спасибо. Однако замена [] для array() сделает PHP 5.3 достаточным для этой задачи и не потребует 5.4. – Langdi

0

Если я правильно понимаю это, вы хотите получить разницу между датой начала и датой окончания.

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

$begin = strtotime("2013-08-14 10:00:00"); 
$end = strtotime("2013-08-14 23:59:59"); 

$difference = ($end - $begin); 

echo gmdate("H:i:s", $difference); 

Это даст вам время в часах, минутах, затем секундах.

Смежные вопросы