Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Danilo - Jesus voltará!

Somar Horas da Tarde e da Manhã

Recommended Posts

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

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
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
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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.