Aritmética de Horas em PHP

Artigo que apresenta a implementação de uma função em PHP para realizar a manipulação/aritmética de horas.

Alterando as Horas

Outro dia falamos de aritmética de datas. Porém, aritmética de horas pode ser um pouco diferente. O motivo é que as vezes queremos obter um acumulado de horas, que ultrapassa 24 horas, mas que queremos o valor absoluto de horas.

Usar a classe DateInterval não funciona pois ela não converte tudo para uma unidade. A solução que resta é fazer manualmente, tomando uma unidade como base (por exemplo, segundos), depois formatando. Veja a função abaixo:

/**
 * Soma um array de horas
 * @param array[string] $tempos array de horas no formato [+-]H:M:S
 * @return Total de horas no formato H:M:S
 */
function somar_horas(array $tempos) {
    $total_segundos = 0;
    foreach ($tempos as $tempo) {
        if (preg_match('/([+-]?)(\d{2}):(\d{2}):(\d{2})/', $tempo, $matches)) {
            $multiplicador = $matches[1] == '-' ? -1 : 1;
            $total_segundos += $multiplicador *
                               ((int)$matches[2] * 3600 + (int)$matches[3] * 60 + (int)$matches[4]);
        } else {
            throw new InvalidArgumentException('Tempo no formato errado: '.$tempo, 1);
        }
    }
    $sinal          = $total_segundos > 0 ? '' : '-';
    $horas          = floor($total_segundos / 3600);
    $total_segundos = $total_segundos % 3600;
    $minutos        = floor($total_segundos / 60);
    $segundos       = $total_segundos % 60;
    return sprintf('%s%02d:%02d:%02d', $sinal, $horas, $minutos, $segundos);
}

E para usar, basta passar o array de horas a serem somadas ou subtraídas:

$array = array('23:45:09', '13:56:59', '-00:02:01');
echo somar_horas($array);

2 comentários

Cristian Etchebes disse...

Bem interessante teu conteúdo, referente a cálculos com tempo estou tentando buscar os dados do banco mysql e somá-los e após fazer a média, mas meu código não passa disso.
--------------------------------------
". $cont ."
". $tmp_medio;
?>
Poderia me dar uma ajuda? Muito obrigado.

cristian etchebest disse...

"
Bem interessante teu conteúdo, referente a cálculos com tempo estou tentando buscar os dados do banco mysql e somá-los e após fazer a média, mas meu código não passa disso.
/* no banco existem mais de 200 registros de tempo, se eu der um echo dentro do while
os dados aparecem, mas não consigo somá-los e nem fazer a média*/

$sql=mysql_query("SELECT tma FROM cdi");
$cont=mysql_num_rows($sql);
while($res= mysql_fetch_array($sql)){

$total_tempo= $res[0];
}
$tmp_medio=$total_tempo/$cont;

echo $total_tempo ."
". $cont ."
". $tmp_medio;
Poderia me dar uma ajuda? Muito obrigado.
"