Trabalho avançado com datas e horas em PHP: do básico à maestria
Trabalhar com datas e horas é uma das tarefas mais frequentes e, ao mesmo tempo, complexas no desenvolvimento web. Desenvolvedores iniciantes geralmente se limitam às funções date() e time(), mas para criar aplicações verdadeiramente flexíveis e confiáveis, é necessário dominar a abordagem orientada a objetos. Neste artigo, abordaremos técnicas avançadas de trabalho com datas e horas em PHP que ajudarão você a escrever um código mais limpo, seguro e eficiente.
1. Classe DateTime: a base do trabalho moderno com datas
A classe DateTime é o alicerce sobre o qual se constrói todo o trabalho avançado com datas em PHP. Ao contrário das funções procedurais, ela fornece um objeto com um rico conjunto de métodos para manipulação, comparação e formatação.
Criação de objetos DateTime:
<?php// Data e hora atuais$now = new DateTime();echo $now->format('Y-m-d H:i:s'); // 2024-01-15 14:30:00
// Data específica a partir de uma string$birthday = new DateTime('1990-05-20');echo $birthday->format('d.m.Y'); // 20.05.1990
// Com formato relativo$nextWeek = new DateTime('+1 week');echo $nextWeek->format('Y-m-d');?>Modificação de datas com os métodos modify e add/sub:
<?php$date = new DateTime('2024-01-15');
// Usando modify para alterações complexas$date->modify('last day of next month');echo $date->format('Y-m-d'); // 2024-02-29 (ano bissexto)
// add e sub com DateInterval$date->add(new DateInterval('P10D')); // +10 dias$date->sub(new DateInterval('P1M')); // -1 mêsecho $date->format('Y-m-d'); // 2024-03-10?>A principal vantagem do DateTime é a imutabilidade ao usar DateTimeImmutable. Se você não quiser modificar o objeto original, use a versão imutável:
<?php$date = new DateTimeImmutable('2024-01-15');$newDate = $date->modify('+1 month');echo $date->format('Y-m-d'); // 2024-01-15 (data original não foi alterada)echo $newDate->format('Y-m-d'); // 2024-02-15?>2. Fusos horários: globalizando sua aplicação
Ignorar os fusos horários é um dos erros mais comuns. Se sua aplicação trabalha com usuários de diferentes fusos horários, o tratamento correto dos fusos horários torna-se criticamente importante.
Definição e alteração de fuso horário:
<?php// Criando um objeto com um fuso horário específico$tokyo = new DateTime('now', new DateTimeZone('Asia/Tokyo'));echo $tokyo->format('Y-m-d H:i:s'); // Horário em Tóquio
// Alterando o fuso horário de um objeto existente$london = new DateTime('now', new DateTimeZone('Europe/London'));$london->setTimezone(new DateTimeZone('America/New_York'));echo $london->format('Y-m-d H:i:s T'); // Horário em Nova York com abreviação do fuso?>Lista de fusos horários disponíveis:
<?php$timezones = DateTimeZone::listIdentifiers();// Você pode filtrar por região, por exemplo:$europe = DateTimeZone::listIdentifiers(DateTimeZone::EUROPE);print_r($europe);?>Dica prática: Sempre armazene as datas no banco de dados em UTC e converta-as para o fuso horário local apenas ao exibi-las ao usuário. Isso evitará dores de cabeça com as mudanças de horário de verão/inverno.
<?php// Salvando em UTC$utcDate = new DateTime('now', new DateTimeZone('UTC'));$dbDate = $utcDate->format('Y-m-d H:i:s'); // Salva no BD
// Exibindo ao usuário$userDate = new DateTime($dbDate, new DateTimeZone('UTC'));$userDate->setTimezone(new DateTimeZone('America/Los_Angeles'));echo $userDate->format('Y-m-d H:i:s');?>