Я должен вычесть 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?
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
Один из способов получить разницу в секундах — mktime
,
$diff = mktime(...explode(':', $time1)) - mktime(...explode(':', $time2));
Существуют различные способы преобразования обратно в формат строки, который вы хотите. Я собирался предложить использовать sprintf
, но другой ответ уже показывает это, поэтому я не буду беспокоиться.
В общем, когда вы работаете с временными интервалами, я думаю, что все ваши расчеты проще выполнить за секунды, а затем отформатировать свой результат, когда вам нужно его вывести, чтобы избежать необходимости делать подобные вещи.
Вот альтернатива.
$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);
Я просто вычисляю разницу между каждыми часами, минутами и секундами отдельно.
Я прокомментировал код соответствующим образом, чтобы лучше понять, что происходит на каждом этапе.