O tempo não espera: por que lidar com datas em PHP é complicado (e como corrigir isso)
Imagine: você está escrevendo um blog, uma loja virtual ou uma área de cliente. E de repente percebe — precisa mostrar ao usuário quando um artigo foi publicado, um pedido foi feito ou uma mensagem foi enviada. Parece simples, não? É só usar a função date() e pronto.
Mas o diabo, como sempre, está nos detalhes. Em 2025, desenvolvedores PHP ainda cometem os mesmos erros: confundem fusos horários, esquecem a imutabilidade dos objetos, usam funções obsoletas. Depois se surpreendem quando a hora no site "pula" e os testes falham.
Neste artigo, vamos abordar as melhores práticas para trabalhar com data e hora em PHP — desde soluções simples até técnicas profissionais. Você aprenderá como obter a data atual, como trabalhar com fusos horários e como não dar um tiro no pé ao lidar com timestamps.
1. A maneira mais simples: a função date()
Vamos começar com o clássico. A função date() é por onde 90% dos iniciantes começam. Ela aceita dois parâmetros: o formato de saída e (opcionalmente) um timestamp. Se o timestamp não for informado, usa a hora atual do servidor.
echo date('Y-m-d H:i:s');// Saída: 2025-04-08 14:35:12Aqui estão os formatos mais populares:
Y— ano (4 dígitos)m— mês (01–12)d— dia do mês (01–31)H— horas no formato 24 horasi— minutoss— segundos
Problema: date() depende da configuração date.timezone no php.ini. Se você não definir o fuso horário, o PHP usará a hora do sistema do servidor. E o servidor pode estar em outro fuso horário — então seus usuários verão a hora errada.
2. Abordagem profissional: a classe DateTime
A partir do PHP 5.2, temos a classe DateTime. É uma forma orientada a objetos de trabalhar com datas, muito mais flexível e segura do que as funções date() e time().
$now = new DateTime();echo $now->format('Y-m-d H:i:s');// Saída: 2025-04-08 14:35:12Vantagens do DateTime:
- Você pode definir facilmente o fuso horário através do construtor
- Suporta modificação de data (adicionar dias, meses)
- Sabe comparar datas entre si
- Trabalha com intervalos
Exemplo com fuso horário:
$now = new DateTime('now', new DateTimeZone('Europe/Moscow'));echo $now->format('Y-m-d H:i:s');// Saída: 2025-04-08 17:35:12 (MSK, UTC+3)2.1. DateTimeImmutable — seu novo melhor amigo
No PHP 5.5 surgiu o DateTimeImmutable. Sua principal diferença do DateTime comum: ele não modifica a si mesmo. Em vez disso, cada método (como modify() ou add()) retorna um novo objeto.
$date = new DateTimeImmutable();$modified = $date->modify('+1 day');
echo $date->format('Y-m-d'); // 2025-04-08 (não mudou!)echo $modified->format('Y-m-d'); // 2025-04-09 (novo objeto)Por que isso é importante? Porque o DateTime comum é um objeto por referência. Se você passá-lo para uma função e ele for modificado lá, o original também será alterado. Com o Immutable, esse problema não existe. Em 2025, isso é considerado o padrão de facto para projetos sérios.
3. Como obter timestamp: time() vs DateTime
Às vezes você precisa não da data, mas do Unix timestamp — o número de segundos desde 1º de janeiro de 1970. O PHP oferece dois caminhos:
// Método antigoecho time(); // 1744112112
// Método novoecho (new DateTime())->getTimestamp(); // 1744112112Para tarefas simples, time() é perfeitamente adequado