【问题标题】:Substract an amount of time to an addition of times将时间量减去时间量
【发布时间】:2018-09-19 15:15:29
【问题描述】:

我必须在 php 中将 32:30:00(字符串)减去 95:05:00(字符串):

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 来做到这一点?

【问题讨论】:

  • 那些不是有效时间...$time1$time2 正在返回 falsefalse - false == 0 - 0 == 0
  • 谢谢,这是时间的加法...就像您将花在做某事上的时间与花在做某事上的时间相加一样......
  • 我认为您所说的“95:05:00”代表 95 小时 5 分钟和零秒是否正确?
  • 是的,正确,这就是我所拥有的......谢谢,也许你应该知道一个可以计算这个的库?
  • @jaja5000 - 我打算建议将小时和分钟转换为秒,然后进行计算,但这几乎就是 R. Chappell 在下面回答的内容。

标签: php strtotime


【解决方案1】:

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,但其他答案已经显示了,所以我不会打扰。

    一般来说,当您处理时间间隔时,我认为在几秒钟内完成所有计算并在需要输出结果时格式化结果会更容易,这样您就可以避免需要做这种事情。

    【讨论】:

    • 哦,我更喜欢你的。 ❤
    • @R.Chappell 谢谢!这在代码方面有点不完整,但老实说,我认为最重要的部分是关于尽可能长时间地将值保持为整数(秒)而不是在格式化值之间来回切换的声明。
    • 感激不尽,我现在才开始试验代码
    【解决方案3】:

    这是另一种选择。

    $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);
    

    我只是分别算出每个小时、分钟和秒之间的差异。

    我已相应地对代码进行了注释,以便更深入地了解每个阶段发生的情况。

    【讨论】:

    • 非常感谢,我现在正在尝试你的代码,没有言语可以解释我有多感激
    • @jaja5000 我认为在 R Chappell 和 Don't Panic 之间,他们的答案比我的要好得多。优雅很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多