我将数据库中保存的总工作时间保存为如下文本: hhhhh:mm,例如一辆车有789:07小时工作(789小时7分钟)。 可以添加或减少工作时间,我会按小时和分钟分割字符串,并按照以下方式进行操作:
function addHours($initialTime, $endTime){
$hourStart = $this->getHoursMinutes($initialTime);
$hourEnd = $this->getHoursMinutes($endTime);
$totalMinutes = $hourStart[1] + $hourEnd[1];
$totalHours = 0;
if($totalMinutes >= 60){
$totalHours = 1;
$totalMinutes -= 60;
}
$totalHours = $hourStart[0] + $hourEnd[0];
return sprintf("%02d", $totalHours).":".sprintf("%02d", $totalMinutes);
}
substract
方法是:
function substractHours($initialTime, $endTime){
$hourStart = $this->getHoursMinutes($initialTime);
$hourEnd = $this->getHoursMinutes($endTime);
$totalHours = $hourEnd[0] - $hourStart[0];
$totalMinutes = $hourEnd[1] - $hourStart[1];
if($totalMinutes <0){
$totalMinutes += 60;
$totalHours--;
}
return sprintf("%02d", $totalHours).":".sprintf("%02d", $totalMinutes);
}
这些方法一直有效,直到我不得不减去两个小时:
50:00 - 50:06
结果必须是-00:06(如excel函数),但我得到的是-1:54,我真的不知道如何解决这个问题。
我通过其他方式使用PHP函数或论坛和帖子中的示例代码,但它在24:00作为最大值工作。
答案 0 :(得分:0)
当小时的标志和分钟的标志不同时,您的问题就出现了,因为您需要将分钟转换为小时。因此,您需要检查这些情况并进行相应处理:
function substractHours($initialTime, $endTime){
$hourStart = $this->getHoursMinutes($initialTime);
$hourEnd = $this->getHoursMinutes($endTime);
$totalHours = $hourEnd[0] - $hourStart[0];
$totalMinutes = $hourEnd[1] - $hourStart[1];
if($totalHours > 0 && $totalMinutes < 0) {
$totalMinutes = 60 + $totalMinutes;
$totalHours--;
}
else if ($totalHours < 0 && $totalMinutes > 0) {
$totalMinutes = 60 - $totalMinutes;
$totalHours++;
}
return sprintf("%02d", $totalHours).":".sprintf("%02d", $totalMinutes);
}
然而,将小时数转换为分钟数,进行数学计算并转换回来可能更容易。
$start = $hoursStart[0]*60 + $hoursStart[1];
$end = $hoursEnd[0]*60 + $hoursEnd[1];
// ... do math ...
$totalHours = floor(abs($total / 60));
$totalMinutes = abs($total) % 60;
$sign = $total < 0 ? "-" : "";
答案 1 :(得分:0)
在这种情况下,最好的办法是将其存储在最小单位中 分钟。每个操作都会更容易。你应该转换成你的 显示此数据时的最终格式。
以下是显示格式化时间的函数示例:
function
formattedTime($min): string
{
$sign = $min < 0 ? '-' : '';
$min = abs($min);
return sprintf('%s%02d:%02d', $sign, intdiv($min, 60), $min % 60);
}
然后,您实际上不需要函数来减去或添加时间
可以使用标准运算符+
或-
。但如果由于某种原因你不能
更改您的数据格式,或者您必须继续使用这些功能
将传递的时间转换为分钟并对其进行操作。它很多
更简单的:
function
getMinutes($time): int
{
$pieces;
if (preg_match('/(\d+):(\d+)/', $time, $pieces))
return $pieces[1]*60 + $pieces[2];
return -1; # or throw Exception, i.e.
}
function
addHours($initialTime, $endTime)
{
$initialTime = getMinutes($initialTime);
$endTime = getMinutes($endTime);
return formattedTime($initialTime + $endTime);
}
function
subtractHours($initialTime, $endTime)
{
$initialTime = getMinutes($initialTime);
$endTime = getMinutes($endTime);
return formattedTime($initialTime - $endTime);
}
答案 2 :(得分:0)
没有必要存储小时和分钟。只需坚持一个单位时间,并在整个应用程序中使用它。请记住,计算机并不关心分钟和小时的区别,就计算机而言,它只是一个数字。只有用户关心。
如果您同时存储小时和分钟,则必须完成您尝试实施的所有操作,但如果您只存储分钟,那么总计一段运行的总时间就变成了一个简单的补充,甚至是SELECT SUM(column_name)
查询。
如果用户关心小时和分钟,那么您可以使用floor()和模数运算符在显示时进行简单转换。
$hours = floor($total_minutes_as_fetched_from_database / 60);
$minutes = $total_minutes_as_fetched_from_database % 60;
echo "Total time is $hours hour(s) and $minutes minute(s)";