Вычитание времени

1890
07 февраля 2017, 23:13

Есть три времени, получаемые из БД (Время прихода, время ухода и перерывы). Пробую делать так:

    $time1 = strtotime($row['3']); // Время выключения
    $time2 = strtotime($row['2']); //Время включения
    $time3 = strtotime($row['4']); //Перерывы
    $diff = $time1-$time2-$time3;
    $summi = floor($diff);

Считает не совсем правильно. К примеру:

Время включения: 04:47:00

Время выключения: 05:33:00

Перерывы: 00:07:33

Должно получиться 00:38:27 а получается 20:38:27

Что не так?

Answer 1

Можно воспользоваться DateInterval для корректного вычисления разницы.
Если я правильно понял, $row[4] содержит суммарное количество секунд на перерывы.

$row = [
  '2' => '2017-02-06 08:00:00',
  '3' => '2017-02-06 18:10:00',
  '4' => 3660
];
$dateOn  = new \DateTime($row['2']);
$dateOff = new \DateTime($row['3']);
$delays = (int)$row['4'];
$dateOn->add(new DateInterval('PT'.$delays.'S'));
$time = $dateOff->diff($dateOn);
echo $time->format('%H:%I:%S'); // 09:09:00
$row = [
  '2' => '06:25:00',
  '3' => '07:00:00',
  '4' => '00:10:00'
];
$dateOn  = new \DateTime($row['2']);
$dateOff = new \DateTime($row['3']);
if ($dateOn > $dateOff) {
  $dateOff->add(DateInterval::createFromDateString('1 day'));
}    
if ($row['4']) {
  list($h, $i, $s) = explode(':', $row[4]);
  $dateOn->add(new DateInterval("PT{$h}H{$i}M{$s}S"));
}
$time = $dateOff->diff($dateOn);
echo $time->format('%H:%I:%S'); // 00:25:00

Этот формат очень неудачен:

  1. Интервал хранится, как отформатированное время, проще хранить его просто, как число секунд.
  2. Отсутствуют даты, там, где они необходимы. Приходится вручную проверять факт смены дат. Если кто-либо захочет поработать более суток, результат будет некорректен.
READ ALSO
Активировать обновлённый icu на php7

Активировать обновлённый icu на php7

Уже Обновление ICU на PHP7 обсуждалось: Скомпилил в папку /opt/icu5c, а дальше просто не понял, что нужно сделать! А как же активировать

380
imagick увеличить размер полотна

imagick увеличить размер полотна

У меня есть некоторое изображениеМне нужно с помощью imagick создать для него квадратное превью, но дело в том, что изображение может быть любой...

400
Связные списки в opencart

Связные списки в opencart

Делаю связные списки в opencart

424
Перезаписать массив

Перезаписать массив

Здравствуйте, у меня есть вложенные массивы:

356