Como Trabalhar com Datas Usando a Orientação a Objetos no PHP (Classe DateTime)
Por que abandonar as funções antigas e usar a classe DateTime?
Até agora, neste curso, vimos como manipular o tempo usando funções como date(), mktime() e strtotime(). Elas funcionam bem para tarefas simples. No entanto, em sistemas grandes, lidar com fuso horário e cálculos matemáticos de datas pode se tornar um pesadelo.
Para resolver isso, o PHP introduziu a programação orientada a objetos no controle do tempo através da poderosa classe DateTime. Ela provê uma série de métodos, atributos e possibilidades que tornam o nosso código muito mais limpo, seguro e profissional.
Criando objetos e o Construtor da classe DateTime
Basta instanciar a classe sem nenhum parâmetro usando:
$data = new DateTime();. Automaticamente, o PHP criará um objeto contendo a data, a hora exata daquele milissegundo e o fuso horário configurado no servidor.
Vamos criar o nosso primeiro objeto e usar a função print_r() para espiar o que tem dentro dele:
<?php
$dataAtual = new DateTime();
print_r($dataAtual);
?>
O resultado será um objeto estruturado mais ou menos assim:
DateTime Object (
[date] => 2026-05-22 14:30:15.123456
[timezone_type] => 3
[timezone] => America/Fortaleza
)
Inicializando com uma data específica
Nós não precisamos nos limitar ao momento atual. O método construtor da classe aceita uma string (texto) para inicializar o objeto já com uma data definida no passado ou no futuro, usando o formato ano-mes-dia:
<?php
// Escolhendo uma data específica
$dataEspecifica = new DateTime("2020-02-28");
// Podemos também usar termos relativos (em inglês)
$ontem = new DateTime("-1 day");
?>
Formatando datas e horas: Método format()
Ter o objeto é ótimo, mas como mostramos isso para o usuário? A classe DateTime possui o método format() que utiliza exatamente os mesmos parâmetros da função date() clássica.
Para exibirmos no padrão brasileiro (dd/mm/YYYY Hora:minuto:segundo), basta fazer:
<?php
$data = new DateTime();
echo $data->format("d/m/Y H:i:s");
// Saída: 22/05/2026 14:30:15
?>
Somando e Subtraindo datas (Método modify)
Para manipular uma data já existente, você pode usar os termos em inglês direto no construtor ou usar o método elegante modify().
<?php
$data = new DateTime(); // Pega a data de hoje
// Voltando 35 dias no tempo
$data->modify('-35 days');
echo "Há 35 dias era: " . $data->format("d/m/Y") . "<br>";
// Avançando 2 semanas e 10 dias a partir da data modificada
$data->modify('+2 weeks 10 days');
echo "Futuro: " . $data->format("d/m/Y");
?>
Diferença entre datas: O espetacular Método diff()
Imagina calcular, de maneira instantânea, a diferença de anos, meses, dias, horas, minutos e até segundos entre duas datas? O método diff() faz isso de forma brilhante. Ele calcula a diferença e retorna um novo objeto chamado DateInterval.
Vamos pegar a data de hoje e calcular a distância até o Natal do ano atual:
<?php
$hoje = new DateTime();
// Descobre o ano atual e define o Natal
$anoAtual = $hoje->format('Y');
$natal = new DateTime($anoAtual . '-12-25');
// Calcula a diferença ($diff se torna um objeto DateInterval)
$diff = $hoje->diff($natal);
echo "<h3>Faltam exatamente:</h3>";
echo $diff->m . " meses <br/>";
echo $diff->d . " dias <br/>";
echo $diff->h . " horas <br/>";
echo $diff->i . " minutos <br/>";
echo $diff->s . " segundos para o Natal!<br/><br/>";
// DICA SÊNIOR: Você também pode acessar o total de dias absolutos
echo "Isso equivale a " . $diff->days . " dias totais corridos.";
?>
Bem preciso esse PHP, não?
Modificando Data e Hora: setDate() e setTime()
Após criar e definir seu objeto, é totalmente possível mudar seus atributos isoladamente através dos setters (métodos de configuração).
<?php
$data = new DateTime();
echo "Original: " . $data->format("d/m/Y H:i") . "<br />";
// Mudando apenas a data para 01 de Março de 2026
// Parâmetros: (Ano, Mês, Dia)
$data->setDate(2026, 3, 1);
// Mudando apenas a hora para 12:00:00 (Meio-dia)
// Parâmetros: (Hora, Minuto, Segundo)
$data->setTime(12, 0, 0);
echo "Modificada: " . $data->format("d/m/Y H:i");
?>
Bonitinho, não?
Comparando Datas de forma inteligente
Muitas vezes, em regras de negócio (como verificar se um cupom de desconto expirou), é preciso saber se uma data é anterior ou posterior à outra. A beleza da classe DateTime é que ela nos permite usar operadores matemáticos simples (>, <, ==) para comparar objetos diretamente!
<?php
$hoje = new DateTime();
$vencimento = new DateTime('+5 days'); // Vence daqui a 5 dias
// O vencimento é maior (posterior) a hoje?
if ($vencimento > $hoje) {
echo "Tudo certo! O boleto ainda está dentro do prazo.";
} else {
echo "Boleto vencido. Pague com juros.";
}
?>
Que maravilha não precisar converter nada para comparar, certo?
Perguntas Frequentes (FAQ) e Dicas Sênior
O que é a classe DateTimeImmutable?
DateTime altera o objeto original quando você usa métodos como modify(). Já a classe DateTimeImmutable (inserida nas versões mais novas do PHP) funciona exatamente igual, mas nunca altera o objeto original; ela sempre retorna um novo objeto. Isso evita bugs terríveis em sistemas grandes onde uma mesma variável de data é reutilizada em várias partes do código. Em projetos profissionais atuais, dê preferência sempre para DateTimeImmutable.
Nenhum comentário:
Postar um comentário