Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal, fiz uma function que tá funcionando blz... mas ao aplicar ela com os dados que vem do BD, ela soma 28 datas corretas e em duas está somando 1 hora a mais, já tentei achar o erro e não consegui ainda.. se alguém puder dar uma força estou postando todo o código abaixo com 1 data somando correto e a outra que acrescenta 1 hora a mais na soma que deveria dar 4:12 e não 5:12 como está dando...
function trabalhadas($dt_emanha, $dt_smanha, $dt_etarde, $dt_starde){ $en_manha = strtotime($dt_emanha). $sa_manha = strtotime($dt_smanha). $en_tarde = strtotime($dt_etarde). $sa_tarde = strtotime($dt_starde). //CALCULA HORAS DA MANHA $hr_manha = $sa_manha - $en_manha. $horas_manha = floor($hr_manha / 3600). $minutos_manha = floor(($hr_manha / 60) % 60). //CALCULA HORAS DA TARDE $hr_tarde = $sa_tarde - $en_tarde. $horas_tarde = floor($hr_tarde / 3600). $minutos_tarde = floor(($hr_tarde / 60) % 60). $htrab_inicial = mktime($horas_manha,$minutos_manha,00,1,1,0). $htrab_final = mktime($horas_tarde,$minutos_tarde,00,1,1,0). $time_trab = $htrab_inicial + $htrab_final. $total_trab = date("H:i", $time_trab). return $total_trab. } echo trabalhadas("2019-11-05 19:01:00","2019-11-05 21:00:00","2019-11-05 21:15:00","2019-11-05 23:28:00")."<br /><hr>". //esta soma errado>
Agora, Johnny Saymon disse:
Não busquei identificar a falha no seu código, mas chuto que pode ter relação com os arredondamentos, ao invés de procurar uma solução para esse código, proponho uma refatoração, veja esse modelo:
<?php
function intervaloTrabalhado(
DateTime $manhaEntrada,
DateTime $manhaSaida,
DateTime $tardeEntrada,
DateTime $tardeSaida
): DateInterval
{
$manhaIntervalo = $manhaEntrada->diff($manhaSaida);
$tardeIntervalo = $tardeEntrada->diff($tardeSaida);
$horas = $manhaIntervalo->h + $tardeIntervalo->h;
$minutos = $manhaIntervalo->i + $tardeIntervalo->i;
$intervalo = new DateInterval("PT{$horas}H{$minutos}M");
return $intervalo;
}
$intervalo1 = intervaloTrabalhado(
new DateTime('2019-11-05 19:01:00'),
new DateTime('2019-11-05 21:15:00'),
new DateTime('2019-11-05 21:15:00'),
new DateTime('2019-11-05 23:28:00')
);
$intervalo2 = intervaloTrabalhado(
new DateTime('2019-11-05 19:00:00'),
new DateTime('2019-11-05 20:32:00'),
new DateTime('2019-11-05 20:47:00'),
new DateTime('2019-11-06 01:14:00')
);
echo $intervalo1->format("%H:%I");
echo PHP_EOL;
echo $intervalo2->format("%H:%I");
echo PHP_EOL;
O código pode ser melhorado, é apenas um modelo.
Olá Johnny, obrigado pela resposta... mas ao testar seu código ele dá o erro "Esta página não está funcionando"...
mudei a versão do php e mesmo assim não rodou...
Você testou de boa aí?
valeu por enquantoSim. Funcionou normalmente, qual a versão do seu PHP?
>
Agora, Johnny Saymon disse:
Sim. Funcionou normalmente, qual a versão do seu PHP?
Tava 5.6, aí mudei pra 7.0 e depois pra 7.3
em todas deu o mesmo erro
Atualizei o código lá na postagem inicial, favor, tenta novamente na versão 7.3
>
Agora, Johnny Saymon disse:
Atualizei o código lá na postagem inicial, favor, tenta novamente na versão 7.3
Agora rodou, mas o horário ficou errado, e ao trocar 21:15 por 21:00 ele devolve 3:72 ao invés de 4:12....
o horário correto é este aqui:
$intervalo1 = intervaloTrabalhado(
new DateTime('2019-11-05 19:01:00'),
new DateTime('2019-11-05 21:00:00'),
new DateTime('2019-11-05 21:15:00'),
new DateTime('2019-11-05 23:28:00')
);Verdade! Cometi um erro grotesco. Fiz a atualização do código. Tenta novamente.
>
Agora, Johnny Saymon disse:
Verdade! Cometi um erro grotesco. Fiz a atualização do código. Tenta novamente.
Cara blz... agora rodou certinho...
Ótimo. Que bom que funcionou para você.
Enviei uma mensagem privada.
Não busquei identificar a falha no seu código, mas chuto que pode ter relação com os arredondamentos, ao invés de procurar uma solução para esse código, proponho uma refatoração, veja esse modelo:
): DateInterval {$intervalo1 = intervaloTrabalhado(
$intervalo2 = intervaloTrabalhado(