Diferença entre datas em PHP: 5 abordagens do simples ao profissional

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como calcular a diferença entre duas datas em PHP: do iniciante ao profissional

\n\n

Você já se perguntou: “Quantos dias se passaram desde minhas últimas férias?” ou “Daqui a quantas horas termina a promoção no site?”? Se você é desenvolvedor PHP, essas perguntas se transformam em uma tarefa: como calcular a diferença entre duas datas.

\n\n

Esta pergunta é uma das mais populares no Stack Overflow com milhares de visualizações. E não é à toa: trabalhar com datas em PHP pode ser traiçoeiro. Anos bissextos, fusos horários, formatos diferentes — tudo isso pode quebrar até o código mais bem planejado.

\n\n

Neste artigo, vamos abordar 5 maneiras comprovadas de calcular a diferença entre datas em PHP — das mais simples às profissionais. Você aprenderá quando usar cada método e receberá exemplos de código prontos.

\n\n

1. Método clássico: strtotime() e aritmética simples

\n\n

A maneira mais antiga e intuitiva é converter as datas em timestamps Unix com a função strtotime() e simplesmente subtrair um número do outro.

\n\n
<?php\n$date1 = strtotime('2024-01-15');\n$date2 = strtotime('2024-03-20');\n\n$diff_seconds = $date2 - $date1;\n$diff_days = floor($diff_seconds / (60 * 60 * 24));\n\necho "Diferença em dias: " . $diff_days; // Exibirá: 65\n?>
\n\n

Prós: simplicidade, funciona em qualquer versão do PHP.

\n

Contras: não considera fusos horários, problemas com datas anteriores a 1970, sem suporte nativo para meses e anos (já que sua duração varia).

\n\n

Este método é adequado para cálculos rápidos “de improviso”, mas para projetos sérios é melhor usar ferramentas mais modernas.

\n\n

2. Padrão moderno: classe DateTime e método diff()

\n\n

A partir do PHP 5.2, temos a poderosa classe DateTime. É um verdadeiro canivete suíço para trabalhar com datas. O método diff() retorna um objeto DateInterval, que contém todas as informações sobre a diferença.

\n\n
<?php\n$date1 = new DateTime('2024-01-15');\n$date2 = new DateTime('2024-03-20');\n\n$interval = $date1->diff($date2);\n\necho "Diferença: " . $interval->days . " dias"; // 65\necho "ou " . $interval->m . " meses e " . $interval->d . " dias"; // 2 meses e 5 dias\n?>
\n\n

DateInterval dá acesso às seguintes propriedades:

\n
    \n
  • y — anos
  • \n
  • m — meses
  • \n
  • d — dias
  • \n
  • h — horas
  • \n
  • i — minutos
  • \n
  • s — segundos
  • \n
  • days — número total de dias (o mais útil!)
  • \n
  • invert — sinalizador: 0 se a primeira data for anterior, 1 se for posterior
  • \n
\n\n

Este método considera anos bissextos e funciona corretamente com diferentes peculiaridades do calendário. É o recomendado na documentação oficial do PHP.

\n\n

3. Formatação da diferença: como exibir “2 anos 3 meses 10 dias”

\n\n

Frequentemente, não basta obter um número, mas sim formatar a diferença de forma elegante para o usuário. O método format() do objeto DateInterval vem em socorro.

\n\n
<?php\n$birthday = new DateTime('1990-05-15');\n$today = new DateTime();\n\n$age = $birthday->diff($today);\n\necho $age->format('%y anos %m meses %d dias');\n// Exemplo: 34 anos 2 meses 3 dias\n?>
\n\n

Especificadores de formato:

\n
    \n
  • %y — anos
  • \n
  • %m — meses
  • \n
  • %d — dias
  • \n
  • %h — horas
  • \n
  • %i — minutos
  • \n
  • %s — segundos
  • \n
  • %a — número total de dias (alternativa a days)
  • \n
  • %r — sinal de "menos" se a diferença for negativa
  • \n
\n\n

Quer a flexão das palavras “dia/dias”? Você terá que escrever sua própria ló

Blogs

Book Recommendations