Вычесть количество времени до сложения - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужно вычесть 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?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

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

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

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

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

0 голосов
/ 19 сентября 2018

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

$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 голосов
/ 19 сентября 2018

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
...