如何计算负/正时间且大于24:00

问题描述 投票:1回答:1

我必须使用来自数组的时间进行计算:'+ 04:43''03:33''-10:33'

我尝试使用Datetime和东西,但是当它超过24:00时,课程就破了。 (例如10:00 + 20:00)

所以我尝试了这样的事情:我把所有的......变成了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 calc
1个回答
0
投票

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

代码:(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

附:当您在:上分配时间时,小时可能是正数或负数,但分钟将始终为正数。这是您发布的代码段的基本问题。

© www.soinside.com 2019 - 2024. All rights reserved.