Ir para conteúdo
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.

Editado por Johnny Saymon
Correção de código.

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

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