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 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);
?>
days (dias), weeks (semanas), months (meses) e years (anos).
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:
- O que é Instanciar um Objeto? Achou estranho o comando
new DateTime()? Estude nossa introdução imperdível às Classes e Objetos no PHP (Orientação a Objetos). - Fusos Horários: Aprenda a configurar seu servidor para não ter erros de fuso com a nossa aula sobre A função date_default_timezone_set().
- Manual Oficial: Consulte a lista completa de termos em inglês que o PHP aceita lendo os Formatos Relativos no Manual Oficial do PHP.
Perguntas Frequentes (FAQ) da Comunidade
A função strtotime() consegue ler meses em português (ex: "40 dias")?
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?
+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:
Postar um comentário