HOWTO · PHP

Como obter a diferença de tempo em minutos em PHP

Este artigo introduz como obter a diferença de tempo em minutos em PHP. Inclui a função date_diff() e fórmulas matemáticas.

Nesta página

Para calcular em minutos o tempo decorrido entre dois valores de data e hora em PHP, subtraia os timestamps Unix e divida os segundos por 60. Use essa abordagem quando precisar calcular uma duração. Use date_diff() quando precisar de um intervalo de calendário e strtotime() quando as entradas forem strings que possam ser analisadas. Mantenha os dois valores no mesmo contexto de fuso horário e decida se o resultado deve preservar o sentido da diferença ou representar seu valor absoluto.

Calcular minutos decorridos a partir de timestamps

DateTimeImmutable deixa os valores de entrada explícitos e evita alterá-los durante o cálculo. Defina um fuso horário para ambos; o exemplo usa UTC. Subtrair os timestamps produz segundos decorridos com sinal: se o valor final for posterior, o resultado será positivo, e o sinal dependerá da ordem da subtração. Use abs() em torno da diferença somente quando o sentido não importar. Dividir por 60 preserva as frações de minuto; use uma função de arredondamento apenas se a aplicação exigir minutos inteiros.

Execute este exemplo. Ele exibe o total de minutos decorridos; o rótulo da saída permanece em inglês no bloco imutável.

<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-16 10:00:00', $timezone);

$elapsedMinutes = ($end->getTimestamp() - $start->getTimestamp()) / 60;
echo "Elapsed minutes: $elapsedMinutes\n";

Para calcular o tempo realmente decorrido durante mudanças de horário de verão, use timestamps de valores de data e hora no fuso horário pretendido. Em um fuso que observa o horário de verão, não presuma que todo dia do calendário tenha exatamente 1.440 minutos decorridos.

Use date_diff() para diferenças entre datas no calendário

date_diff() (também disponível como $start->diff($end)) retorna um DateInterval, e não uma única contagem de minutos decorridos. Os componentes de dias, horas e minutos são úteis quando a pergunta é formulada em termos de calendário, como “quantos dias, horas e minutos de diferença?”. A propriedade invert do intervalo indica o sentido quando a data final é anterior à inicial; o argumento absolute pode suprimir essa indicação. O exemplo a seguir exibe os componentes do intervalo, com os rótulos em inglês no bloco imutável.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-18 12:30:00', $timezone);

$interval = date_diff($start, $end);
echo $interval->format('%R%a days, %h hours, and %i minutes');

Para um intervalo de calendário, você pode calcular uma quantidade nominal de minutos a partir dos componentes com $interval->days * 1440 + $interval->h * 60 + $interval->i. Esse cálculo combina dias do calendário e componentes do relógio; ele não substitui a subtração de timestamps quando você precisa dos minutos exatos decorridos durante transições de fuso horário. Se o sentido importar, preserve o sinal do intervalo ou aplique-o ao valor calculado usando $interval->invert.

Analisar strings de horário com strtotime()

strtotime() converte uma string de data e hora que possa ser analisada em um timestamp Unix. Uma string que contenha apenas o horário é interpretada em relação a um contexto de data; por isso, forneça datas completas quando os valores puderem atravessar a meia-noite ou pertencer a datas diferentes. Defina explicitamente o fuso horário padrão ou inclua um fuso horário em cada string, para que ambos os timestamps usem o contexto pretendido. A subtração abaixo mantém o sinal do resultado; use abs() para obter uma duração sem sinal. O exemplo exibe os minutos decorridos, e o rótulo da saída permanece em inglês no bloco imutável.

<?php
date_default_timezone_set('UTC');
$start = strtotime('2024-06-16 23:30:00 UTC');
$end = strtotime('2024-06-17 00:15:00 UTC');

$minutes = ($end - $start) / 60;
echo "Elapsed minutes: $minutes\n";

Ao analisar entradas não confiáveis ou variáveis, verifique se cada chamada retornou um timestamp antes de subtrair; a análise pode falhar e retornar false. Para dados da aplicação que exigem um tratamento claro de fuso horário, prefira criar valores DateTimeImmutable com um fuso horário explícito. Use strtotime() para analisar strings de forma concisa, a subtração de timestamps para calcular o tempo decorrido e date_diff() quando precisar descrever o próprio intervalo de calendário.