Diferença entre datas em PHP: do iniciante 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: guia completo com exemplos

\n\n

Você já precisou saber "quantos dias se passaram desde o cadastro do usuário?", "qual a idade de uma pessoa pela data de nascimento?" ou "quantas horas faltam para o fim da promoção?"? Se sim, com certeza já se perguntou: como calcular a diferença entre duas datas em PHP? Essa é uma das perguntas mais frequentes no Stack Overflow, e não é à toa: trabalhar com datas é um tópico fundamental, mas cheio de armadilhas.

\n\n

Neste artigo, vamos explorar três abordagens principais: a clássica strtotime(), a moderna e orientada a objetos DateTime, e a poderosa biblioteca externa Carbon. Você vai aprender não apenas "como fazer", mas também qual método escolher para cada situação. Vamos nessa!

\n\n

Por que simplesmente subtrair datas é uma má ideia?

\n\n

Desenvolvedores iniciantes frequentemente tentam fazer algo assim:

\n\n
<?php\n$data1 = '2024-01-15';\n$data2 = '2024-01-10';\n$diferenca = $data2 - $data1; // Erro! Não se pode subtrair strings\n?>\n
\n\n

O PHP não sabe subtrair strings, mesmo que elas se pareçam com datas. O resultado será 0 ou um aviso. Mesmo se você usar strtotime() e obter timestamps Unix, a simples subtração de segundos vai te dar apenas a quantidade de segundos, e não um formato amigável como "2 dias, 3 horas e 15 minutos". Para isso, precisamos de ferramentas específicas.

\n\n

Abordagem 1: A clássica — strtotime() e cálculos manuais

\n\n

Este método é conhecido por quem começou com PHP 4 ou 5. A função strtotime() converte uma representação textual de data em um timestamp Unix (número de segundos desde 1º de janeiro de 1970). Em seguida, subtraímos os timestamps e dividimos pelo número de segundos em um dia.

\n\n

Exemplo: diferença em dias

\n\n
<?php\n$data1 = strtotime('2024-12-25');\n$data2 = strtotime('2024-12-20');\n\n$diferenca_segundos = $data1 - $data2;\n$diferenca_dias = floor($diferenca_segundos / (60 * 60 * 24));\n\necho "Diferença: $diferenca_dias dias"; // Exibe: Diferença: 5 dias\n?>\n
\n\n

Vantagens: simplicidade, não requer objetos, execução rápida.

\n\n

Desvantagens:
\n- Sem suporte a fusos horários (sempre UTC).
\n- Ao lidar com horário de verão/inverno, pode haver um erro de 1 hora (e consequentemente de 1 dia, se a mudança de horário cair no seu intervalo).
\n- Para obter a diferença em meses ou anos, é necessário implementar uma lógica complexa considerando anos bissextos.

\n\n

Quando usar: apenas para cálculos aproximados (ex.: "já passaram mais de 30 dias?") ou se você estiver trabalhando com uma base de código legada.

\n\n

Abordagem 2: DateTime e DateInterval — o padrão moderno do PHP

\n\n

A partir do PHP 5.2, a linguagem ganhou a poderosa classe DateTime. Em conjunto com DateInterval, ela resolve 95% dos problemas relacionados a datas. Esta é a forma recomendada para calcular a diferença entre duas datas em PHP.

\n\n

Exemplo básico: diferença em dias, meses e anos

\n\n
<?php\n$data1 = new DateTime('2024-01-15');\n$data2 = new DateTime('2023-11-10');\n$intervalo = $data1->diff($data2);\n\necho $intervalo->format('%y anos, %m meses, %d dias');\n// Exibe: 0 anos, 2 meses, 5 dias\n?>\n
\n\n

A mágica é que o método diff() lida automaticamente com anos bissextos, diferentes quantidades de dias nos meses e até mesmo fusos horários (se forem especificados).

\n\n

Acessando componentes individuais

\n\n
<?php\n$data1 = new DateTime('2024-12-25');\n$data2 = new DateTime('2024-01-01');\n$intervalo = $data1->diff($data2);\n\necho "Anos: " . $intervalo->y . "<br>";\necho "Meses: " . $intervalo->m . "<br>";\necho "Dias: " . $intervalo->d . "<br>";\necho "Total de dias: " . $intervalo->days . "<br>";\n// Exibe:\n// Anos: 0\n// Meses: 11\n// Dias: 24\n// Total de dias: 359\n?>\n
\n\n

Observe a propriedade days — ela representa o número total de dias no intervalo (diferente de d, que mostra apenas os dias restantes após calcular anos e meses).

Blogs

Book Recommendations