PHP

Calcular a diferença entre horas utilizando PHP

20/03/2022PHP

 Neste artigo vamos ver como calcular a diferença de horas no PHP.

Para nosso primeiro exemplo, vamos utilizar os seguintes intervalos de tempo:

 

$hora_inicial = '17:22:00';

$hora_final = '18:02:00';

 

Para o nosso calculo, vamos criar um array com estes dois intervalos de tempo.

 

$i = 1;

$tempo_total;

$tempos = array($hora_final, $hora_inicial);

 

Cada elemento do array é um horário. Vamos separar as horas, os minutos e os segundos utilizando a função explode, e o seu resultado será atribuido a uma lista onde vamos criar variáveis nesta mesma ordem, ou seja, hora, minuto e segundo. A função explode recebe dois parâmetros, o primeiro é o separador que vai ser utilizado, que em nosso caso são os dois pontos. O segundo parâmetro e a strign que vai ser separada, que são os horários armazenados no array.

 

foreach($tempos as $tempo) {

list($h, $m, $s) = explode(':', $tempo);

}

 

Agora vamos converter em segundos cada um dos horários informados e vamos guardar este resultado em segundos num array auxiliar. Para converter em segundos, multiplicamos as horas por 3600 e os minutos por 60.

 

$i = 1;

$tempo_total;

 

$tempos = array($hora_final, $hora_inicial);

 

foreach($tempos as $tempo) {

$segundos = 0;

 

list($h, $m, $s) = explode(':', $tempo);

$segundos += $h * 3600;

$segundos += $m * 60;

$segundos += $s;

 

$tempo_total[$i] = $segundos;

 

$i++;

}

 

Agora que temos a duração em segundos de cada horário, basta fazer a substração de um valor pelo outro.

 

$segundos = $tempo_total[1] - $tempo_total[2];

 

Para concluir, vamos converter este resultado  em segundos para ser exibido no formato hora:minuto:segundo.

 

$horas = floor($segundos / 3600);

$segundos -= $horas * 3600;

$minutos = str_pad((floor($segundos / 60)), 2, '0', STR_PAD_LEFT);

$segundos -= $minutos * 60;

$segundos = str_pad($segundos, 2, '0', STR_PAD_LEFT);

 

echo "$horas:$minutos:$segundos";

 

Nesse código,  utilizamos a função floor para arrendondar a divisão para baixo dos segundos por 3600, seu retorno é um número inteiro. A função str_pad serve para gerar um resultado com zero a esquerda, caso a variável utilizada tenha apenas 1 dígito.

 

O código completo ficaria da seguinte formato:

 

$hora_inicial = '17:22:00';

$hora_final = '18:02:00';

 

$i = 1;

$tempo_total;

 

$tempos = array($hora_final, $hora_inicial);

 

foreach($tempos as $tempo) {

$segundos = 0;

 

list($h, $m, $s) = explode(':', $tempo);

$segundos += $h * 3600;

$segundos += $m * 60;

$segundos += $s;

 

$tempo_total[$i] = $segundos;

 

$i++;

}

$segundos = $tempo_total[1] - $tempo_total[2];

 

$horas = floor($segundos / 3600);

$segundos -= $horas * 3600;

$minutos = str_pad((floor($segundos / 60)), 2, '0', STR_PAD_LEFT);

$segundos -= $minutos * 60;

$segundos = str_pad($segundos, 2, '0', STR_PAD_LEFT);

 

echo "$horas:$minutos:$segundos";

 

Vamos ver agora um exemplo mais sofisticado. Vamos trabalhar com um sistema de ponto. Vamos ter horário de entrada, horário de inicio do almoço, horáro de término do almoço e horário de saída. Com base nestes quatro horários informados, vamos calcular o intervalo de tempo trabalhado.

 

$dt_entrada1 = '08:15';

$dt_saida1 = '12:10';

 

$dt_entrada2 =  '14:00';

$dt_saida2 = '18:00';

 

// Faz o cálculo das horas

$total = (strtotime($dt_saida1) - strtotime($dt_entrada1)) + (strtotime($dt_saida2) - strtotime($dt_entrada2));

 

A função strtotime pega uma string no formato de data ou hora e converte num UNIX Timestamp, que é um número represetando os números de segundos desde 01/01/1970.

Agora que temos o tempo total entre as duas datas, vamo fazer a conversão deste resultado em horas e minutos, para poder exibir o resultado formatado.

 

// Encontra as horas trabalhadas

$hours      = floor($total / 60 / 60);

// Encontra os minutos trabalhados

$minutes    = round(($total - ($hours * 60 * 60)) / 60);

$hours = str_pad($hours, 2, "0", STR_PAD_LEFT);

$minutes = str_pad($minutes, 2, "0", STR_PAD_LEFT);

// Exibe no formato "hora:minuto"

echo $hours.':'.$minutes;

 

Utilizando a função str_pad foi possível formatar a hora e os minutos com dois números. Caso a hora ou minuto seja apenas 1 número, ele acrescenta um zero a esquerda.

 

O código completo ficará da seguinte forma:

 

$dt_entrada1 = '08:15';

$dt_saida1 = '12:10';

 

$dt_entrada2 =  '14:00';

$dt_saida2 = '18:00';

 

// Faz o cálculo das horas

$total = (strtotime($dt_saida1) - strtotime($dt_entrada1)) + (strtotime($dt_saida2) - strtotime($dt_entrada2));

 

// Encontra as horas trabalhadas

$hours      = floor($total / 60 / 60);

// Encontra os minutos trabalhados

$minutes    = round(($total - ($hours * 60 * 60)) / 60);

// Formata a hora e minuto para ficar no formato de 2 números, exemplo 00

$hours = str_pad($hours, 2, "0", STR_PAD_LEFT);

$minutes = str_pad($minutes, 2, "0", STR_PAD_LEFT);

// Exibe no formato "hora:minuto"

echo $hours.':'.$minutes;

 

Encerramento

Neste artigo você aprendeu como calcular a diferença entre horas utilizando PHP.

Se você também conhece bancos de dados SQL, pode fazer esta operação direto no seu banco de dados.

No artigo a seguir eu mostro como isso pode ser feito no SQL

Calcular a diferença entre horas utilizando SQL

Outros conteudos que podem ser de seu interesse

Removendo acentos e caracteres especiais com PHP
07/06/2020PHP

Removendo acentos e caracteres especiais com PHP

Veja como remover acentos e caracteres especiais com PHP

Saiba mais...
Manipulando datas com PHP
08/11/2020PHP

Manipulando datas com PHP

Veja várias formas de trabalhar com datas no PHP

Saiba mais...

Conteúdo sobre banco de dados sem complicação!

MySQL - Referência Rápida

 

SQL Server - Referência Rápida

 

SQL vs Mongo