Manipulando Datas com a Classe DateTime em PHP (POO)

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

Como instanciar uma data atual no PHP?
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
?>

Domine a Orientação a Objetos de Verdade 🏆

"Aprender classes como a DateTime abriu minha mente. Eu finalmente entendi o que são métodos, propriedades e objetos. O material progressivo foi a ponte que faltava para eu criar meus primeiros sistemas robustos!" - Camila F., Desenvolvedora Web.

Não pare por aqui! Se você deseja elevar sua carreira, criar sistemas seguros, gerenciar bancos de dados e dominar a arquitetura MVC, você precisa da Apostila Oficial de PHP Progressivo. Estude no seu ritmo, de forma sequencial e garanta seu certificado.

📥 Baixar Apostila e Obter Certificado

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?

A classe 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.

Onde posso consultar todos os métodos da classe?

A classe possui métodos para manipular Fusos Horários (Timezones), lidar com erros de formatação e criar datas a partir de padrões complexos. Para dominar todas essas ferramentas extras, a leitura obrigatória é a documentação oficial da classe DateTime no PHP.net.

Nenhum comentário: