Como Somar e Subtrair Datas no PHP (strtotime e DateTime)

Calculando Datas no Futuro e no Passado: Da função strtotime() à Classe DateTime no PHP

Por que precisamos de "Matemática de Datas"?

Muitas vezes, durante o desenvolvimento de um sistema, é necessário descobrir uma data exata projetada para o futuro ou resgatada do passado.

Por exemplo: se um cliente assina seu serviço hoje e tem 7 dias de teste grátis, qual será a data exata da primeira cobrança? Ou se você quer mostrar os relatórios de vendas dos últimos 30 dias, que data foi essa no mês passado?

Obviamente, não vamos ficar fazendo contas na mão, tentando descobrir se o mês atual tem 28, 30 ou 31 dias. O PHP faz essa mágica para nós de duas formas principais: o método clássico (função strtotime) e o método moderno (classe DateTime).


O Método Clássico: A função strtotime()

O que significa strtotime?
O nome vem de String to Time (Texto para Tempo). É uma função nativa do PHP que lê um texto em inglês (inspirado nos formatos do GNU/Linux) e o converte para um Unix Timestamp matemático, permitindo que você some ou subtraia tempo facilmente.

Calculando datas no Futuro

Para exibir uma data daqui a 40 dias, a sintaxe é extremamente descritiva e simples:


<?php
    // Transforma a frase "40 dias" num valor de tempo (Timestamp)
    $futuro = strtotime("40 days");
    
    // Formata esse Timestamp de volta para um formato legível
    echo "Daqui a 40 dias será: " . date("d/m/Y", $futuro);
?>

Você pode ser ainda mais complexo. Veja como calcular uma data para daqui a 3 semanas, ou até mesmo 2 semanas e 4 dias:


<?php
    // Somando 3 semanas
    $tres_semanas = strtotime("3 weeks");
    echo "Daqui a 3 semanas: " . date("d/m/Y", $tres_semanas) . "<br>";

    // Misturando valores: 2 semanas e 4 dias
    $misturado = strtotime("2 weeks 4 days");
    echo "Daqui a 2 semanas e 4 dias: " . date("d/m/Y", $misturado);
?>

Calculando datas no Passado

A sintaxe é exatamente a mesma, mas inserimos o sinal de menos (-) antes do número para indicar que queremos subtrair tempo.


<?php
    // Voltando 20 dias no tempo
    $passado = strtotime("-20 days");
    echo "Vinte dias atrás era: " . date("d/m/Y", $passado) . "<br>";

    // Voltando 1 semana
    $semana_passada = strtotime("-1 week");
    echo "Uma semana atrás era: " . date("d/m/Y", $semana_passada);
?>
💡 Dica de Vocabulário: Como a função lê em inglês, os termos que você mais vai usar são: days (dias), weeks (semanas), months (meses) e years (anos).

Pare de Escrever Código Antigo e Garanta seu Espaço no Mercado 🚀

"Eu usava strtotime() para tudo, até tentar entrar numa vaga Pleno que exigia Laravel. Fui reprovado no teste prático porque não dominava Orientação a Objetos. A Apostila Progressiva atualizou meu nível e finalmente passei na entrevista!" - Matheus R., Desenvolvedor Back-end.

Conhecer o básico é importante, mas o mercado de trabalho atual exige arquiteturas modernas, códigos limpos e programação orientada a objetos (POO). Domine o PHP do zero ao profissional com a nossa Apostila Oficial de PHP Progressivo. Pare de colar códigos da internet e comece a entender o porquê de cada vírgula.

📥 Baixar Apostila PHP Progressivo Agora

O Padrão Sênior: Manipulando o Tempo com a Classe DateTime (PHP 8+)

A função strtotime() quebra um galho enorme e você verá ela em milhões de sistemas espalhados pelo mundo. Mas, se você quer programar como um verdadeiro profissional e utilizar as melhores práticas da Orientação a Objetos no PHP, você deve conhecer a Classe DateTime.

A Classe DateTime é mais robusta, entende fusos horários perfeitamente e possui um método interno incrível chamado modify(), que aceita as exatas mesmas regras em inglês do strtotime, mas de forma encapsulada e segura.

Veja como fazemos os mesmos cálculos (futuro e passado) usando a arquitetura moderna:


<?php
    // 1. Instanciamos a data de HOJE
    $dataAtual = new DateTime();
    
    // 2. Modificamos o objeto para 40 dias no futuro
    $dataAtual->modify('+40 days');
    echo "Boleto vence em: " . $dataAtual->format('d/m/Y') . "<br>";
    
    // ----------------------------------------------------

    // 3. Instanciamos uma NOVA data de hoje
    $outraData = new DateTime();

    // 4. Modificamos para voltar 20 dias no tempo
    $outraData->modify('-20 days');
    echo "A promoção iniciou em: " . $outraData->format('d/m/Y');
?>

Repare que ao usar $objeto->format('d/m/Y'), não precisamos mais da função matemática da aula passada, pois a própria classe DateTime já sabe como se autotraduzir! Lindo, não é?


Consolide seu Conhecimento (O que estudar a seguir)

A matemática das datas é um marco na vida do programador. Fortaleça sua base técnica com os links abaixo:


Perguntas Frequentes (FAQ) da Comunidade

A função strtotime() consegue ler meses em português (ex: "40 dias")?

Não. O motor interno do PHP que processa as datas entende puramente os comandos estruturados na língua inglesa. Se você escrever strtotime("40 dias") em português, a função não reconhecerá o texto e retornará false, quebrando o seu script e imprimindo uma data errada (geralmente fixando em 1970).

O que acontece se eu somar "+1 month" (1 mês) no dia 31 de janeiro?

Essa é uma armadilha famosa (Bug do Fevereiro). Se você está no dia 31 de Janeiro e usa +1 month, o PHP avança para o mês 2. Como fevereiro não tem dia 31, o PHP "escorrega" os dias excedentes para o mês seguinte, caindo no dia 2 ou 3 de Março. A forma mais segura de contornar isso em renovações de assinatura é usar o termo first day of next month (primeiro dia do mês que vem) ou calcular os dias exatos.

Nenhum comentário: