PHP: как получить разницу во времени в массиве - PullRequest
0 голосов
/ 09 июля 2019

У меня есть time_in и time_out для моего приложения.

У меня есть массив с ключом 0,2,4.., так что это time_in , тогда как 1,3,5.. это time_out .

Я хочу получить общее количество рабочих часов .

Вот пример массива ниже:

$time = [
    [0] => 08:12:00,
    [1] => 12:01:00 
    [2] => 08:14:00, 
    [3] => 12:05:00,
    [4] => 13:13:00,
    [5] => 17:13:00,
    [6] => 13:03:00,
    [7] => 17:00:00,
    ];

Результат: 17 hours and 1 minute

Возможно ли, что вы можете получить разницу во времени, используя массив? Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Может возникнуть соблазн использовать date () для вывода времени, но date () предназначена для дат, а не для вывода времени.
Если используется дата, то значение, превышающее 24 часа, будет неверным.
Вместо этого используйте математику для расчета времени.

foreach(array_chunk($time, 2) as $t){
    $seconds[] = strtotime($t[1])-strtotime($t[0]);
}

echo "hours: " . floor(array_sum($seconds)/3600) . "\n";
echo "minutes: " . (array_sum($seconds)%3600)/60 . "\n";

См. Пример, я также добавил date (), чтобы доказать, что это не тот метод, который нужно использовать:
https://3v4l.org/m2E27

0 голосов
/ 09 июля 2019

Вы можете использовать foreach с strtotime

$sum = 0;
foreach($time as $k => $v){
  if($k % 2 == 1){
    $sum += strtotime($time[$k])-strtotime($time[$k-1]);
  }
}
echo date("H:i:s", $sum);

В соответствии с предложением Андреаса обновленный ответ: -

$seconds = 0;
foreach($time as $k => $v){
if($k % 2 == 1){
  $seconds += strtotime($time[$k])-strtotime($time[$k-1]);
 }
}
echo floor($seconds / 3600) . gmdate(":i:s", $seconds % 3600);

DEMO

...