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