时间表达式数组的总小时数和格式总计 a H:i:s

问题描述 投票:0回答:2

我正在尝试使用 MySQL 格式

00:00:00
来计算小时数。我试图用
foreach()
对它们求和,但是当总和达到
24:00:00
时,它会在
00:00:00
重新开始。 我需要总数可能大于 24 小时。

这是我对它们求和的代码:

foreach ($hours as $h) {
    $sumaHoras = date(
        'H:i:s',
        strtotime($sumaHoras) + strtotime($h->horas) - strtotime('00:00')
    );
}
php arrays time sum
2个回答
1
投票

问题是,仅返回 date() 的小时部分,您将删除大于的任何内容 一整天,因此它只会返回 00:00 到 23:59 之间的内容。你应该使用除 date() 并且仅当所有秒数相加时。

所以你应该尝试这样的事情:

function sec2hours($seconds){
  $units = array(
    'hours'   => 3600,
    'minutes' => 60,
    'seconds' => 1,
  );
  foreach($units as &$unit){
    $quot  = intval($seconds / $unit);
    $seconds -= $quot * $unit;
    $unit  = $quot;
  }
  $str = array();
  foreach($units as $name => $value){
    $str[] = ($value === 0?'00':$value);
  }
  return implode(':',$str);
}

$sum = 0;
foreach($hours as $h){
 $sum += strtotime($h->horas) - strtotime('00:00');
}
$sumaHoras = sec2hours($sum);

第二个问题是 strtotime() 在本应滚动到 25:00 等天的时间上返回 false, 所以如果你得到这样的一个输入,它将变成 0 - strtotime('00:00') 并且你最终会得到一个巨大的负和。 但如果所有输入都在 00-23:00-59 之间,应该没问题。


0
投票

我认为这段代码很有帮助

foreach ($timeArr $key=> $timevalue) {
    $timesumArr[$key] = date(
        'H:i:s',
        array_sum(array_map('strtotime', $timevalue))
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.