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.
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:
- A Base do Tempo: Se o número
1551028815do começo do tutorial pareceu grego, reveja nossa aula sobre a Função time() e o Unix Timestamp. - Módulo de Orientação a Objetos: O padrão moderno
IntlDateFormatterusa conceitos de OO (como as setinhas->). Se você ficou confuso, acesse nossa introdução às Classes e Objetos no PHP. - Documentação Oficial: Como um bom profissional de TI, valide a obsolescência da função lendo o Aviso de Depreciação no Manual Oficial do PHP.
Perguntas Frequentes (FAQ) da Comunidade
O que significa "Thread Safe" e por que a setlocale() falha nisso?
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?
['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:
Postar um comentário