Danilo - Jesus voltará! 1 Denunciar post Postado Dezembro 19, 2019 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 echo trabalhadas("2019-11-05 19:00:00","2019-11-05 20:32:00","2019-11-05 20:47:00","2019-11-05 01:14:00");//esta soma correto Compartilhar este post Link para o post Compartilhar em outros sites
Johnny Saymon 2 Denunciar post Postado Dezembro 20, 2019 (editado) 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); $intervalo = new DateTime('00:00'); $intervalo->add($manhaIntervalo); $intervalo->add($tardeIntervalo); return $intervalo->diff(new DateTime('00:00')); } $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') ); $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. Editado Dezembro 20, 2019 por Johnny Saymon Correção de código. Compartilhar este post Link para o post Compartilhar em outros sites
Danilo - Jesus voltará! 1 Denunciar post Postado Dezembro 20, 2019 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 enquanto Compartilhar este post Link para o post Compartilhar em outros sites
Johnny Saymon 2 Denunciar post Postado Dezembro 20, 2019 Sim. Funcionou normalmente, qual a versão do seu PHP? Compartilhar este post Link para o post Compartilhar em outros sites
Danilo - Jesus voltará! 1 Denunciar post Postado Dezembro 20, 2019 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 Compartilhar este post Link para o post Compartilhar em outros sites
Johnny Saymon 2 Denunciar post Postado Dezembro 20, 2019 Atualizei o código lá na postagem inicial, favor, tenta novamente na versão 7.3 Compartilhar este post Link para o post Compartilhar em outros sites
Danilo - Jesus voltará! 1 Denunciar post Postado Dezembro 20, 2019 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') ); Compartilhar este post Link para o post Compartilhar em outros sites
Johnny Saymon 2 Denunciar post Postado Dezembro 20, 2019 Verdade! Cometi um erro grotesco. Fiz a atualização do código. Tenta novamente. Compartilhar este post Link para o post Compartilhar em outros sites
Danilo - Jesus voltará! 1 Denunciar post Postado Dezembro 20, 2019 Agora, Johnny Saymon disse: Verdade! Cometi um erro grotesco. Fiz a atualização do código. Tenta novamente. Cara blz... agora rodou certinho... Compartilhar este post Link para o post Compartilhar em outros sites
Johnny Saymon 2 Denunciar post Postado Dezembro 20, 2019 Ótimo. Que bom que funcionou para você. Enviei uma mensagem privada. Compartilhar este post Link para o post Compartilhar em outros sites