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.

Como Somar e Subtrair Datas no PHP (strtotime e DateTime)

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 que significa 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);
?>
💡 Dica de Vocabulário: Como a função lê em inglês, os termos que você mais vai usar são: days (dias), weeks (semanas), months (meses) e years (anos).

Pare de Escrever Código Antigo e Garanta seu Espaço no Mercado 🚀

"Eu usava strtotime() para tudo, até tentar entrar numa vaga Pleno que exigia Laravel. Fui reprovado no teste prático porque não dominava Orientação a Objetos. A Apostila Progressiva atualizou meu nível e finalmente passei na entrevista!" - Matheus R., Desenvolvedor Back-end.

Conhecer o básico é importante, mas o mercado de trabalho atual exige arquiteturas modernas, códigos limpos e programação orientada a objetos (POO). Domine o PHP do zero ao profissional com a nossa Apostila Oficial de PHP Progressivo. Pare de colar códigos da internet e comece a entender o porquê de cada vírgula.

📥 Baixar Apostila PHP Progressivo Agora

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:


Perguntas Frequentes (FAQ) da Comunidade

A função strtotime() consegue ler meses em português (ex: "40 dias")?

Não. O motor interno do PHP que processa as datas entende puramente os comandos estruturados na língua inglesa. Se você escrever 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?

Essa é uma armadilha famosa (Bug do Fevereiro). Se você está no dia 31 de Janeiro e usa +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.

Como Saber Quantos Dias Tem o Mês no PHP (Atual, Passado e Futuro)

Descobrindo o Número de Dias de um Mês no PHP: Do Básico às Técnicas Avançadas

Por que contar os dias de um mês é tão importante?

Uma das grandes utilidades de se trabalhar com datas no back-end é saber quantos dias exatos um determinado mês possui. Pense bem: se você está programando um sistema de assinaturas tipo Netflix, e o cliente assina no dia 31 de janeiro, quando será a próxima cobrança se fevereiro só vai até o dia 28?

Errar esse cálculo significa perder dinheiro ou irritar o usuário. Neste tutorial, vamos te mostrar como o PHP resolve isso de maneira incrivelmente simples, sem que você precise decorar calendários ou escrever dezenas de comandos if/else para descobrir anos bissextos.


Número de Dias do Mês Atual: O parâmetro date('t')

Como pegar o último dia do mês atual?
No PHP, basta utilizar a função date('t'). A letra 't' minúscula é um parâmetro especial de formatação que não retorna uma data, mas sim o número total de dias contidos no mês atual da execução do script (retornando um valor de 28 a 31).

Para deixarmos a informação completa, podemos combinar o date('t') com o date('F'), que como vimos no tutorial de parâmetros da função date(), retorna o nome do mês em inglês.

Veja como é simples montar a frase:


<?php
    echo "Há " . date('t') . " dias no mês de " . date('F');
    // Saída em fevereiro: Há 28 dias no mês de February
?>

Se você preferir exibir o formato numérico (ex: "mês 02") para não ter problemas com o idioma inglês, basta trocar o parâmetro 'F' pelo 'm':


<?php
    echo "Há " . date('t') . " dias no mês " . date('m');
    // Saída: Há 28 dias no mês 02
?>

O Jeito Certo de Escrever em Português (PHP 8+)

Em tutoriais antigos (PHP 7 ou inferior), era muito comum usar as funções setlocale() e strftime() para forçar o idioma do servidor para português. Atenção: essas funções foram descontinuadas no PHP 8.1.

Para gerar a frase "O mês de Fevereiro tem 28 dias" de forma segura nos dias de hoje, usamos a classe IntlDateFormatter. Veja o padrão ouro do mercado:


<?php
    // Instancia o formatador de datas focado apenas em extrair o nome do mês (MMMM)
    $formatadorMes = new IntlDateFormatter('pt_BR', IntlDateFormatter::NONE, IntlDateFormatter::NONE, null, null, 'MMMM');
    
    // Transforma a primeira letra em maiúscula por estética
    $nomeMes = ucfirst($formatadorMes->format(time()));
    
    echo "O mês de " . $nomeMes . " tem " . date('t') . " dias.";
    // Saída: O mês de Fevereiro tem 28 dias.
?>

Construa Lógicas Imbatíveis no Back-end 🧠

"Manipular datas era meu pesadelo. Eu criava dezenas de IFs para calcular os meses. A Apostila me ensinou atalhos e funções nativas do PHP que reduziram meus códigos pela metade!" - Carlos T., Desenvolvedor PHP.

Saber a sintaxe é fácil; dominar a lógica e os truques dos veteranos é o que separa um júnior de um programador sênior. Conheça nossa Apostila Oficial de PHP Progressivo. O material definitivo para quem quer aprender Orientação a Objetos, banco de dados e sistemas robustos sem enrolação.

📥 Baixar Apostila PHP Progressivo Agora

Número de Dias de QUALQUER Mês: O Truque Sênior da mktime()

Certo, o date('t') funciona perfeitamente para o mês em que estamos. Mas e se você precisar saber quantos dias teve fevereiro de 1988?

Para cálculos viajando no tempo, podemos resgatar nossa querida função mktime(). Relembrando a sintaxe dela:

mktime($hora, $minuto, $segundo, $mes, $dia, $ano);

Existe um truque lógico espetacular aqui. Se você pedir ao PHP para calcular o dia 0 do mês 3 (Março), o motor do PHP entra em curto-circuito lógico? Não! Ele é inteligente. Ele entende que o "dia 0" de um mês é, na verdade, o último dia do mês anterior!

Assim, o dia 0 do mês 3 (Março) de 1988 é o último dia do mês 2 (Fevereiro) de 1988.


<?php
    // Extraindo o dia ('d') do Timestamp gerado no dia 0 de Março (mês 3) de 1988
    $ultimo_dia = date('d', mktime(0, 0, 0, 3, 0, 1988));
    
    echo "Fevereiro de 1988 teve " . $ultimo_dia . " dias.";
    // Saída: Fevereiro de 1988 teve 29 dias. (Foi um ano bissexto!)
?>

Prontinho! A variável $ultimo_dia sempre guardará a exata quantidade de dias daquele mês específico, validando automaticamente os anos bissextos (quando fevereiro recebe 29 dias). É uma sacada genial de programação!


A Alternativa Nativa: cal_days_in_month()

Se você achou o truque da mktime() muito "hacker" e quer deixar o seu código mais legível para outros programadores que lerem o seu sistema no futuro, o PHP possui uma função nativa criada exclusivamente para contar os dias de um mês num calendário.

O nome dela é bastante sugestivo: cal_days_in_month().


<?php
    // Parâmetros: (TIPO DE CALENDÁRIO, MÊS, ANO)
    $dias_fev_1988 = cal_days_in_month(CAL_GREGORIAN, 2, 1988);
    
    echo "Usando a função nativa: " . $dias_fev_1988 . " dias.";
?>
💡 Dica Rápida: A constante CAL_GREGORIAN indica que estamos usando o Calendário Gregoriano, que é o padrão oficial usado no Brasil, em Portugal e em quase todo o ocidente hoje.

Consolide seu Conhecimento (O que estudar a seguir)

Dominar o fluxo do tempo no back-end evita dores de cabeça incalculáveis no futuro. Siga em frente na nossa apostila online com estes guias:


Perguntas Frequentes (FAQ) da Comunidade

O comando date('t') entende se o ano atual é bissexto automaticamente?

Sim, absolutamente. O motor do PHP embute cálculos astronômicos precisos baseados no sistema operacional. Se você executar um script com echo date('t'); no mês de Fevereiro de um ano bissexto (como 2024 ou 2028), ele retornará automaticamente o número 29.

Qual abordagem tem a melhor performance: date('t') ou cal_days_in_month()?

Para o mês atual, a função date('t') é microscopicamente mais rápida porque não exige a injeção de 3 parâmetros, lendo direto do Timestamp ativo. No entanto, para pesquisar meses passados ou futuros, cal_days_in_month() é muito mais limpa e gasta menos processamento do que calcular o "dia 0" via mktime(). Na prática diária corporativa, essa diferença de milissegundos é imperceptível. Use o que deixar o código mais legível para a sua equipe.

Última Modificação da Página em PHP: Função getlastmod()

Por que informar a última atualização é crucial?

Quase sempre, é extremamente importante saber quando foi a última vez que uma página web foi modificada. Imagine que você gerencia um site de promoções, um portal de notícias ou um blog de tecnologia. É essencial exibir a data e o horário das postagens para que os usuários saibam se as informações estão "fresquinhas" ou se aquela promoção imperdível já expirou.

Além da confiança do usuário, os motores de busca (como o Google) amam conteúdo atualizado. Mostrar de forma clara quando um arquivo foi alterado ajuda os robôs de busca a indexarem seu site com mais eficiência.


Obtendo a Data de Modificação: A função getlastmod()

Para que serve a getlastmod() no PHP?
A função getlastmod() (Get Last Modification) é uma função nativa do PHP que verifica os metadados do arquivo atual no servidor e retorna a data exata em que o script (o arquivo .php) foi salvo/modificado pela última vez. O retorno é dado no formato de Unix Timestamp.

Sua invocação não requer nenhum parâmetro, pois ela olha automaticamente para o arquivo onde foi digitada. Vamos testar:


<?php
    echo getlastmod();
?>

Resultado esperado: 1551106973

Ou seja, ela vai te retornar um Timestamp. Mas convenhamos, você não vai exibir isso para o seu visitante, certo? Dizer "Última atualização: 1551106973 segundos desde a Era Unix" espantaria qualquer cliente!


Formatando a Saída (Lidando com o Padrão Antigo e o Moderno)

Como vimos nas aulas passadas, precisamos de um tradutor para transformar esse Timestamp em algo humano.

O Padrão Clássico (Sistemas Legados)

Em sistemas mais antigos (PHP 7 ou inferior), a prática comum era usar a função strftime() combinada com a setlocale() para exibir a data em português. O código ficava assim:


<?php
    // CÓDIGO LEGADO (Não recomendado para projetos novos)
    setlocale(LC_ALL, 'pt_BR.utf8');
    echo "Última atualização: " . strftime('%d/%B/%G às %H:%M:%S', getlastmod());
?>

Resultado: Última atualização: 25/fevereiro/2019 às 12:08:28

O Padrão Moderno (Obrigatório no PHP 8+)

Como a função strftime() foi descontinuada para evitar bugs em servidores globais, a forma correta e recomendada pelo mercado atual é utilizar a poderosa função date() (se quiser exibir em formato numérico simples) ou a classe IntlDateFormatter (para texto em português).

Veja como é simples e moderno resolver o problema hoje em dia:


<?php
    // 1. O jeito mais fácil (Formato numérico universal)
    $ultima_att = getlastmod();
    echo "Atualizado em: " . date("d/m/Y H:i:s", $ultima_att);
    echo "<br>";

    // 2. O jeito profissional em Português (Classe Intl)
    $formatador = new IntlDateFormatter('pt_BR', IntlDateFormatter::LONG, IntlDateFormatter::SHORT);
    echo "Revisado em: " . $formatador->format($ultima_att);
?>

Bem mais elegante e seguro, não é?


🚨 A Armadilha do Banco de Dados (Cuidado!)

Muitos iniciantes colocam a função getlastmod() na página index.php de um e-commerce e esperam que a data mude quando eles adicionam um novo produto no Banco de Dados (MySQL). Isso NÃO vai acontecer!

A função getlastmod() lê única e exclusivamente a data em que o arquivo de texto .php foi editado no seu editor de código (VS Code, Sublime) e salvo no servidor. Ela não sabe se os dados vindos do banco mudaram. Para rastrear atualizações de banco de dados, você deve ter uma coluna updated_at na sua tabela MySQL.


Técnica Avançada de SEO: Cabeçalhos HTTP (HTTP Headers)

Se você quer que seu site voe nos rankings do Google e economize banda do servidor, você pode ir além de apenas imprimir o texto no HTML do rodapé.

Você pode usar a getlastmod() combinada com a função header() para avisar invisivelmente ao navegador do usuário e aos robôs do Google que a página não mudou desde a última visita deles, permitindo que eles carreguem a página do cache instantaneamente.


<?php
    // Pega a data de modificação
    $timestamp_modificacao = getlastmod();
    
    // Formata exatamente no padrão exigido pelo protocolo HTTP (RFC 2822)
    $data_http = gmdate('D, d M Y H:i:s', $timestamp_modificacao) . ' GMT';

    // Envia o cabeçalho invisível antes de qualquer HTML
    header("Last-Modified: " . $data_http);
?>
<!DOCTYPE html>
<html>
  <!-- O resto do seu site aqui -->

Pare de Cometer Erros de Amador. Torne-se um Profissional. 💼

"Eu demorava dias tentando entender por que o navegador não atualizava meu site e por que o Google não indexava minhas páginas. A apostila me ensinou a controlar os Cabeçalhos HTTP e dominou minhas dúvidas!" - Rafael M., Desenvolvedor Web.

Dicas espalhadas pela internet muitas vezes omitem o "porquê" das coisas. Se você deseja entender profundamente como o PHP se comunica com o navegador, gerencia cache e estrutura lógicas completas, você precisa da Apostila Oficial de PHP Progressivo. Estude no seu ritmo, de forma sequencial e garanta seu certificado ao final.

📥 Baixar Apostila PHP Progressivo Agora

Consolide seu Conhecimento (O que estudar a seguir)

Para dominar o controle de dados no PHP, continue navegando pelos conceitos essenciais:

  • Reforço de Formatação: Ficou na dúvida sobre a função date()? Releia a Aula Completa sobre a função date().
  • Entenda os Cabeçalhos: Quer aprofundar na mágica do SEO e Cache? Estude Como manipular a Função header() no PHP.
  • Documentação Oficial: Sempre consulte os detalhes minuciosos e retornos no Manual do PHP sobre a getlastmod.

Perguntas Frequentes (FAQ) da Comunidade

A função getlastmod() funciona para arquivos incluídos via require/include?

Não diretamente. A função getlastmod() retorna sempre a data do script principal que está sendo executado no navegador (o "pai"). Se você a chamar dentro de um arquivo menu.php que foi incluído no index.php, ela retornará a data de modificação do index.php. Para saber a data de modificação de um arquivo específico incluído, utilize a função nativa filemtime("menu.php").

O que acontece se eu mudar o arquivo de servidor via FTP? A data muda?

Depende de como o seu cliente de FTP está configurado. A grande maioria dos clientes (como o FileZilla) preserva a data original do arquivo. No entanto, se o arquivo for recriado no servidor, a data capturada por getlastmod() passará a ser o instante exato do upload. Por isso, gerenciar atualizações atreladas a banco de dados costuma ser mais confiável em grandes portais.

Datas em Português no PHP: strftime, setlocale e o Padrão Moderno

Como Exibir Datas em Português no PHP: Do setlocale() Clássico ao Padrão Moderno

O Problema do Idioma: Por que não usar apenas a date()?

Até o momento em nosso curso, todas as nossas datas e horários seguiram o padrão da língua inglesa. Quando você solicita o nome de um mês ou de um dia da semana usando a tradicional função date(), o motor do PHP te devolve os termos nativos dele.

Por exemplo, ao rodarmos o código abaixo:

echo date("d/F/Y", 1551028815);

O resultado na tela do usuário será: 24/February/2019.

Para um sistema brasileiro, exibir "February" ou "Monday" em um painel de faturamento ou em um post de blog é amador. Nós somos brasileiros, nossos clientes falam português e nossas aplicações precisam respeitar o idioma local (Fevereiro, Segunda-feira). Para resolver isso em sistemas clássicos, recorremos à dupla dinâmica: setlocale() e strftime().


Definindo o Idioma do Servidor com setlocale()

A função setlocale() serve para avisar ao sistema operacional onde o PHP está rodando que, a partir daquela linha de código, as informações regionais (como datas e formatação de moeda) devem seguir a regra de um país específico.

Para configurarmos nosso script para o Português do Brasil, fazemos a seguinte chamada antes de processar a data:


<?php
    // Define a localização de tudo (LC_ALL) para o Brasil
    setlocale(LC_ALL, 'pt_BR', 'pt_BR.utf-8', 'portuguese');
    
    // ATENÇÃO: Não usamos date(), usamos strftime()
    echo strftime('%A, %d de %B de %Y');
?>

Por que passei vários parâmetros ('pt_BR', 'pt_BR.utf-8', 'portuguese')?
Porque a setlocale() depende do que está instalado no servidor (Linux, Windows, Mac). Passando um array de opções, o PHP tenta o primeiro; se o servidor não tiver suporte, ele tenta o segundo, garantindo que seu código não quebre na hora de ir para o ar.


A Função strftime() e Seus Parâmetros Clássicos

Uma vez que o idioma local foi definido, a função date() tradicional continua sendo inútil (ela ignora o locale). Para extrair a data traduzida, utilizamos a strftime() (String Format Time).

Diferente da date(), os parâmetros da strftime() são sempre precedidos pelo símbolo de porcentagem (%). Abaixo, preparei a tabela de referência definitiva com os comandos mais usados:

Parâmetro O que retorna (Exemplo)
%A Dia da semana completo (domingo)
%a Dia da semana abreviado (dom)
%B Nome do mês completo (fevereiro)
%b ou %h Nome do mês abreviado (fev)
%d Dia do mês com dois dígitos (01 a 31)
%Y Ano com 4 dígitos (2026)
%H : %M : %S Hora (00-23) : Minuto (00-59) : Segundo (00-59)

🚨 AVISO CRÍTICO: O Fim da Linha no PHP 8.1+

É extremamente importante que você aprenda o código acima para dar manutenção em projetos antigos. No entanto, se você está criando um sistema do zero hoje, NÃO USE strftime() nem setlocale().

A função strftime() foi declarada obsoleta (deprecated) no PHP 8.1 e foi completamente removida no PHP 9. Além disso, a setlocale() altera a configuração do servidor inteiro, o que causa bugs assustadores em sistemas modernos e assíncronos. Se você quiser atuar no mercado de trabalho atual, você deve usar a extensão nativa Intl, conforme ensino abaixo.


O Padrão Moderno: A Classe IntlDateFormatter (PHP 8+)

Para formatar datas em português (ou qualquer outro idioma) de maneira segura, limpa e alinhada com as exigências de sistemas robustos e frameworks (como Laravel e Symfony), nós instanciamos a classe de internacionalização IntlDateFormatter.

Veja como é elegante exibir a data de hoje no padrão brasileiro moderno:


<?php
    // Instanciamos o formatador (Idioma, Formato da Data, Formato da Hora)
    $formatador = new IntlDateFormatter(
        'pt_BR', 
        IntlDateFormatter::FULL, // Traz dia da semana e mês por extenso
        IntlDateFormatter::NONE  // Ignora o horário neste caso
    );

    // Passamos a timestamp atual para ser formatada
    echo $formatador->format(time());
    
    // Resultado: domingo, 24 de fevereiro de 2019
?>

Com apenas duas linhas, você tem um código blindado contra erros de servidor, que não atrapalha outros scripts rodando em paralelo, e totalmente aprovado por programadores seniores.


Pare de Estudar Códigos Ultrapassados e Estagne na Carreira 🎓

"Eu não entendia por que meus códigos quebravam no servidor da empresa até descobrir que eu estava usando lógicas de 2015. A apostila Progressiva atualizou totalmente minha forma de programar com Orientação a Objetos!" - Renato S., Desenvolvedor Web.

A internet está cheia de tutoriais que ensinam práticas perigosas que já foram extintas pela documentação oficial. Se você deseja dominar o back-end com excelência, entender Orientação a Objetos e criar projetos reais, invista na nossa Apostila Oficial de PHP Progressivo. Todo o conhecimento estruturado para garantir seu certificado e turbinar seu portfólio.

📥 Baixar Apostila PHP Progressivo com Certificado

Consolide seu Conhecimento (O que estudar a seguir)

Nenhuma arquitetura se sustenta sem alicerces firmes. Agora que você entendeu o conceito de internacionalização (i18n), recomendo fortalecer os temas paralelos:


Perguntas Frequentes (FAQ) da Comunidade

O que significa "Thread Safe" e por que a setlocale() falha nisso?

Thread Safe significa que uma função é segura para ser usada em sistemas que processam múltiplos acessos simultâneos. A função setlocale() não é thread safe porque ela muda a linguagem em nível de sistema operacional/processo. Se o usuário A entrar e o sistema usar setlocale('fr_FR') e no exato mesmo milissegundo o usuário B entrar, a fatura do usuário B pode sair impressa em Francês por acidente. A classe Intl resolve isso pois formata a data apenas na memória do script isolado.

Meu servidor de hospedagem antiga não suporta a extensão Intl. O que eu faço?

Se você estiver preso em um servidor antigo sem suporte ao Intl e com versões legadas do PHP, não há outra saída: você deverá criar um Array associativo traduzindo os meses manualmente (ex: ['January' => 'Janeiro']) e substituir o retorno da date(), ou continuar usando o bloco clássico setlocale() com strftime() enquanto planeja urgentemente a migração do seu servidor para um ambiente moderno.