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
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.
"
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.
"
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com