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.

Nenhum comentário: