Como calcular a diferença entre duas datas em PHP: guia completo com exemplos
\n\nVocê 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\nNeste 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!
Por que simplesmente subtrair datas é uma má ideia?
\n\nDesenvolvedores 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\nO 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.
Abordagem 1: A clássica — strtotime() e cálculos manuais
\n\nEste 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.
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\nVantagens: simplicidade, não requer objetos, execução rápida.
\n\nDesvantagens:
\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.
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\nAbordagem 2: DateTime e DateInterval — o padrão moderno do PHP
\n\nA 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.
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\nA 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).
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\nObserve 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).