如何使用PHP中的累积小时数

时间:2017-06-28 16:23:34

标签: php function hour cumulative-sum

我将数据库中保存的总工作时间保存为如下文本: 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作为最大值工作。

3 个答案:

答案 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)";