Вычтите количество времени до сложения

Я должен вычесть 32:30:00 (строка) в 95:05:00 (строка) в php:

95:05:00 - 32:30:00

Они приходят с добавлением времени.

Я не могу найти работающий код, потому что strtotime не принимает значение больше 24.

Пожалуйста, помогите мне, спасибо.

Например, я пробовал это:

$time1 = strtotime('32:30:00');
$time2 = strtotime('95:05:00');
$difference = round(abs($time2 - $time1) / 3600,2);
echo 'différence : '.$difference;

Возвращает 0

Это должно вернуть что-то вроде 62:35:00

Знаете ли вы, если я могу сделать это с помощью moment.js или php lib?

2

Решение

strtotime не обрабатывает длительности, только допустимые метки времени. Вы можете справиться с этим самостоятельно, разбив время на части, взорвав отметку времени в часах, минутах и ​​секундах. Затем вы можете конвертировать их в общее количество секунд.

<?php
$time1 = '95:05:00';
$time2 = '32:30:00';

function timeToSecs($time) {
list($h, $m, $s) = explode(':', $time);
$sec = (int) $s;
$sec += $h * 3600;
$sec += $m * 60;
return $sec;
}

$t1 = timeToSecs($time1);
$t2 = timeToSecs($time2);
$tdiff = $t1 - $t2;

echo "Difference: $tdiff seconds";

Затем мы можем преобразовать его обратно в часы, минуты и секунды:

$start = new \DateTime("@0");
$end   = new \DateTime("@$tdiff");

$interval = $end->diff($start);

$time = sprintf(
'%d:%02d:%02d',
($interval->d * 24) + $interval->h,
$interval->i,
$interval->s
);

echo $time; // 62:35:00
2

Другие решения

Один из способов получить разницу в секундах — mktime,

$diff = mktime(...explode(':', $time1)) - mktime(...explode(':', $time2));

Существуют различные способы преобразования обратно в формат строки, который вы хотите. Я собирался предложить использовать sprintf, но другой ответ уже показывает это, поэтому я не буду беспокоиться.

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

1

Вот альтернатива.

$time1 = '32:30:00';
$time2 = '95:05:00';

function timeDiff($time1, $time2)
{
$time1 = explode(':', $time1);
$time2 = explode(':', $time2);

// Make sure $time2 is always the bigger time
if ($time1[0] > $time2[0]) {
$temp = $time1;
$time1 = $time2;
$time2 = $temp;
}

// Work out the difference in each of the hours, minutes and seconds
$h = abs($time2[0] - $time1[0]);
$m = abs($time2[1] - $time1[1]);
$s = abs($time2[2] - $time1[2]);

// Ensure that it doesn't say "60", since that is not convention.
$m = $m == 60 ? 0 : $m;
$s = $s == 60 ? 0 : $s;

// If minutes 'overflows', then we need to remedy that
if ($time2[1] < $time1[1]) {
$h -= $h == 0 ? $h : 1;
$m = 60 - $m;
}

// Fix for seconds
if ($time2[2] < $time1[2]) {
$m -= $m == 0 ? -59 : 1;
$s = 60 - $s;
}

// Zero pad the string to two places.
$h = substr('00'.$h, -2);
$m = substr('00'.$m, -2);
$s = substr('00'.$s, -2);

return "{$h}:{$m}:{$s}";
}

echo timeDiff($time1, $time2);

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

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

0