Como calcular a diferença entre duas datas em PHP: do iniciante ao profissional
\n\nVocê 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\nEsta 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\nNeste 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\n1. Método clássico: strtotime() e aritmética simples
\n\nA maneira mais antiga e intuitiva é converter as datas em timestamps Unix com a função strtotime() e simplesmente subtrair um número do outro.
<?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\nPrós: simplicidade, funciona em qualquer versão do PHP.
\nContras: 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\nEste método é adequado para cálculos rápidos “de improviso”, mas para projetos sérios é melhor usar ferramentas mais modernas.
\n\n2. Padrão moderno: classe DateTime e método diff()
\n\nA 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.
<?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\nDateInterval 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
Este método considera anos bissextos e funciona corretamente com diferentes peculiaridades do calendário. É o recomendado na documentação oficial do PHP.
\n\n3. Formatação da diferença: como exibir “2 anos 3 meses 10 dias”
\n\nFrequentemente, 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.
<?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\nEspecificadores 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 adays) \n %r— sinal de "menos" se a diferença for negativa \n
Quer a flexão das palavras “dia/dias”? Você terá que escrever sua própria ló