php - 如何计算负/正时间和大于 24:00?
问题描述
我必须对来自数组的这些时间进行计算:
+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
.
我究竟做错了什么?
解决方案
我想我已经解决了这个问题。使用绝对值进行算术运算并单独处理符号很重要。我已经包含了一些零填充以确保您获得一致的字符串结果。我的正则表达式使+
or-
可选。
代码:(您的 3 个测试用例的演示)
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
ps 当您在 上拆分时间时:
,小时可能是正数或负数,但分钟始终是正数。这是您发布的代码段的一个基本问题。
推荐阅读
- laravel - 在 Vue JS 中使用 Watchers 的警报
- python-3.x - 在 Qt 小部件中重新绘制时出现网格线问题
- r - 非标准评估不起作用: h(simpleError(msg, call)) 中的错误
- c# - MySQL 数据 C# MySql.Data.MySqlClient.MySqlException 而 Database.CreateIfNotExists
- rest - 我想在 VB 6.0 应用程序中使用 RESTful API?
- java - Jooq 对反应式应用程序的 R2DBC 支持
- excel - Excel - 对单元格进行编程以根据另一张纸上的另一个单元格更改颜色
- python - discord.ext.commands.errors.ExtensionNotFound:无法加载扩展“cogs.mod”
- angular - 我们可以从 jasmine 测试代码覆盖率中排除特定的角度分量方法吗?
- typescript - 在地图中搜索图层要素时,坐标返回空