我必须使用来自数组的以下时间进行计算: '+04:43' '03:33' '-10:33'
我尝试使用Datetime和其他东西,但是当它超过24:00时间时,班级就中断了。 (例如10:00 + 20:00)
所以我尝试了这样的事情: 我用explode将所有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,我在做什么错?谢谢。
对不起,我的英语不好,如果您能帮忙但不明白我在说什么,请告诉我。
答案 0 :(得分: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
p.s。在:
上分配时间时,小时数可以是正数或负数,但分钟数始终是正数。这是您发布的代码段的一个基本问题。