【问题标题】:How to calculate negative / positive times and greater than 24:00?如何计算负/正时间和大于 24:00?
【发布时间】:2019-09-18 02:24:47
【问题描述】:

我必须对来自数组的这些时间进行计算:

+04:43
03:33
-10:33

我尝试使用 Datetime 和其他东西,但是当它超过 24:00 时间(例如 10:00 + 20:00)时,课程就中断了。所以我尝试了这样的事情:

我用爆炸将我所有的 hh:mm 转换为秒:

foreach($stringSaldo as $saldo) {
          $horaM[] =  explode(':',$saldo);
      }
      $totalHora = 0;
      $totalMin = 0;
      foreach($horaM as $hora) {
          $totalHora = ($totalHora + $hora[0]);
          $totalMin =( $totalMin + $hora[1]);
      }
      $totalHora = $totalHora * 3600;
      $totalMin = $totalMin * 60;
      $totalSeconds = $totalHora + $totalMin;

然后我试着及时赶上那几秒钟:

$hours = floor($totalSeconds / 3600);
      $minutes = floor(($totalSeconds / 60) % 60);
      $seconds = $totalSeconds % 60;
 echo $hours. ":" . $minutes;

由于某种原因,当我遇到像 -03:34+01:00 这样的时间时,计算失败,它给出了 -02:-26 但它应该是 -02:34

我做错了什么?

【问题讨论】:

    标签: php time


    【解决方案1】:

    我想我已经解决了这个问题。使用绝对值进行算术运算并单独处理符号很重要。我已经包含了一些零填充以确保您获得一致的字符串结果。我的正则表达式使+- 成为可选的。

    代码:(Demo of your 3 test cases)

    function timeToSeconds($time) {
        if (!preg_match('~([+-]?)(\d{2}):(\d{2})~', $time, $out)) {
            echo "failed to parse $time\n";
            return 0;
        } else {
            return (($out[2] * 3600) + $out[3] * 60) * ($out[1] == '-' ? -1 : 1);
        }
    }
    function secondsToTime($seconds) {
        $sign = $seconds < 0 ? '-' : '';
        $abs = abs($seconds);
        return $sign . str_pad(floor($abs / 3600), 2, '0', STR_PAD_LEFT) . ':' . str_pad(floor($abs / 60 % 60), 2, '0', STR_PAD_LEFT);
    }
    
    $times = ['-03:34', '+01:00'];
    $seconds = 0;
    foreach ($times as $time) {
        $seconds += timeToSeconds($time);
    }
    echo $seconds;  // -9240
    echo "\n---\n";
    echo secondsToTime($seconds);  // -02:34
    

    相关资源:https://stackoverflow.com/a/3856312/2943403

    附言当您在: 上拆分时间时,小时数可能为正数或负数,但分钟数始终为正数。这是您发布的 sn-p 的基本问题。

    【讨论】:

    • 你救了我的命,非常感谢,现在工作正常!我花了 10 个小时试图弄清楚我在做什么,哈哈。
    • 您让我重新振作起来的信念是,新用户可以通过尝试编码来发布完整、清晰且可验证的问题。看好你。请总是提出这样的好问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多