sexta-feira, 5 de junho de 2009

Somar horas, minutos e segundos no PHP ( Sum of times )

Sério! Essa informação deveria pelo menos estar à venda por ai... foi muito difícil encontrar alguma informação CORRETA de como fazer isso!!!
Pra começar, quero deixar claro que o meu objetivo aqui é colocar o total de horas!!
TOTAL, ou seja, tipo um banco de horas...onde eu tenho que acumular o quantidade de horas extras que alguém fez, por exemplo.



$times = array(
'01:30:22',
'34:17:03',
);

$seconds = 0;

foreach ( $times as $time ){
list( $g, $i, $s ) = explode( ':', $time );
$seconds += $g * 3600;
$seconds += $i * 60;
$seconds += $s;
}

$hours = floor( $seconds / 3600 );
$seconds -= $hours * 3600;
$minutes = floor( $seconds / 60 );
$seconds -= $minutes * 60;

echo "{$hours}:{$minutes}:{$seconds}";


Achei essa função aqui: http://www.codingforums.com/archive/index.php/t-150266.html
Bom, isso serviu muito bem pra mim, espero que ajude alguém.

17 comentários:

Juca disse...

bahhhh muito útil, é sempre uma dor de cabeça mexer com essas horas...
ahuahuauhaahuauahuahu
Marlaaaaaaaaaaaaaaaaaaaa

Anônimo disse...

Por que tu não me perguntou como era? Te dizia na lata!

Mentira!
Domingo farei prova pro TSI. Se passar, provavelmente estarei estudando essas porcarias aí e sendo feliz. Ou não.

Anônimo disse...

tem um que fiz para somar hora extra:

=60){$total_m=$total_m-60;$total_hr=$total_hr+1; }
$total_hr=$total_hr+$hr;
$h_extra="$total_hr:$total_m";
}

############################## tudo em minutos

$minutos=($total_hr*60)+$total_m;


echo "$h_extra";


if($minutos!=""){

$extra= $minutos*(($salario/(220*60))+((($salario/(220*60))*50)/100));
echo"$horas_total hs - R$ "; echo number_format( $extra, 2, ',', '.');
}?>

Ronaldo Alves Ferreira disse...

=60){$total_m=$total_m-60;$total_hr=$total_hr+1; }
$total_hr=$total_hr+$hr;
$h_extra="$total_hr:$total_m";
}

############################## tudo em minutos

$minutos=($total_hr*60)+$total_m;


echo "$h_extra";


if($minutos!=""){

$extra= $minutos*(($salario/(220*60))+((($salario/(220*60))*50)/100));
echo"$horas_total hs - R$ "; echo number_format( $extra, 2, ',', '.');
}?>

Rafael disse...

Quer casar comigo?

Jonathan disse...

Valew pela dica... ;)

Henrique.Silva disse...

Simplesmente não sei como agradecer, precisava exatamente disso pra somar horas, e nao achava em lugar algum, obrigado por compatilhar.

Lucas de Almeida disse...

Eu faço assim:
function timeDiff($ini, $fim) {

$arr = explode(':', $ini);
$hour = $arr[0];
$min = $arr[1];

$diff = date('H:i', strtotime($fim .' - '. $hour .' hours'));

if(intval($min) > 0)
$diff = date('H:i', strtotime($diff .' - '. $min .' minutes'));

return $diff;
}
Na verdade essa subtrai as horas, mas alterando '-' para '+' ela soma :D
com algumas adaptações tbm pode ser usada para somar ou subtrair datas.
+ 1 day, + 1 week... e por ai vai

FromHell disse...

Parabéns pelo blog, muito util essa function .. vlew

Angel disse...

Ae pessoal. Obrigada pelos comentários e dicas que vcs tem colocado aqui no Blog! Valeu!
=)

Anônimo disse...

Olá, queria saber se tem como adaptar esta função para soma horas usando um campo datetime

Marcus Vinicius disse...

me foi útil este código! éh foda mexer com as horas até na programação. OGRIGADO!

Anônimo disse...

Acabei de achar esse código. Só senti falta do "str_pad" pra que o resultado seja 03:05 ao invés de 3:5. :)

Anônimo disse...

me ajudou bastanta, parabéns

Unknown disse...

Não existe qualquer razão para complicar.


$date=date_create();
date_add($date,date_interval_create_from_date_string("1 hour"));


São duas linhas de código...
Não se esqueçam que $date é um objeto, para quem conhece OOP será mais fácil.


echo date_format($date,"d-m-Y H:i:s.u");


d -> dia
m -> mês
Y -> ano

H -> horas
i -> minutos
s -> segundos
u -> milesimas

Renan Aversa disse...
Este comentário foi removido pelo autor.
Renan Aversa disse...

Usei o código do post e funciona muito bem com saldo de horas positivos, mas com saldo negativo não dá certo, alguém tem alguma ideia de como trabalhar com soma de hora negativa ?

Exemplo do que estou fazendo
Existe um banco de horas onde é somado tanto saldo positivo(+ de 8h sendo lançado apenas a diferença ex: 8:20 é lançado 20 minutos) qto negativo(- de 8h 7:15 é lançado -45 minutos)

Usando o código sitado no post dá um resultado estranho.