Ir para o conteúdo

Tokens de formato de data

Existem duas famílias amplamente usadas de strings de formato de data e elas se sobrepõem apenas o suficiente para ser perigoso. strftime — de C, e herdado por Python, Ruby, PHP e GNU date — usa tokens de porcentagem como %Y. Unicode LDML, usado por ICU, Java, moment e dayjs, usa letras repetidas como yyyy. No LDML, MM é um mês e mm é um minuto; obter esse par ao contrário é o bug clássico.

Cada linha abaixo é renderizada para o mesmo instante: Segunda-feira 9 de março de 2026, 14:05:07 UTC. Essa data é escolhida para que nada se esconda — um dia e mês de um único dígito expõem preenchimento com zeros, a hora da tarde faz o relógio de 12 e 24 horas diferirem visivelmente, e o dia da semana é inequívoco.

Uma coluna de equivalente vazia significa que o outro dialeto não tem um token único para isso e você precisa compor o valor sozinho. O conjunto de testes renderiza os campos do calendário com as funções de data próprias da plataforma e os compara com esta tabela, então os exemplos não podem se desviar da realidade.

Ano

4
strftimeLDMLCampoRenderiza como
%YyyyyAno de quatro dígitos2026
%yyyAno de dois dígitosAmbíguo por construção. Evite em qualquer coisa armazenada.26
%CSéculo — o ano dividido por 10020
%GYYYYAno de numeração de semana ISODifere do ano do calendário no Ano Novo. Use apenas com o número de semana ISO.2026

Mês

4

No LDML, MM é o mês e mm é o minuto.

strftimeLDMLCampoRenderiza como
%mMMMês, preenchido com zero03
%-mMMês, sem preenchimento3
%bMMMNome de mês abreviadoMar
%BMMMMNome do mês completoMarch

Dia e dia da semana

8

No LDML, dd é dia do mês e DDD é dia do ano.

strftimeLDMLCampoRenderiza como
%dddDia do mês, preenchido com zero09
%-ddDia do mês, sem preenchimento9
%eDia do mês, preenchido com espaço 9
%jDDDDia do ano, 001–366068
%aEEENome de weekday abreviadoMon
%AEEEENome do weekday completoMonday
%uWeekday como número, segunda é 1%w numera os mesmos dias a partir de domingo como 0.1
%VwwNúmero de semana ISO, semanas começando segunda11

Hora

8
strftimeLDMLCampoRenderiza como
%HHHHora no relógio de 24 horas14
%-HHHora, sem preenchimento14
%IhhHora no relógio de 12 horas02
%MmmMinuto05
%SssSegundo07
%3NSSSMilissegundos000
%paAM ou PMPM
%sTimestamp Unix — segundos desde 1970-01-01 UTC1773065107

Fuso horário

3

Um deslocamento é um número; um nome de zona é uma regra. Apenas o nome sobrevive a uma mudança de DST.

strftimeLDMLCampoRenderiza como
%zZZDeslocamento UTC, sem dois-pontos+0000
%:zXXXDeslocamento UTC com um dois-pontos, conforme ISO 8601 quer+00:00
%ZzzzAbreviação de fuso horárioAs abreviações não são únicas — CST é pelo menos três zonas diferentes.UTC

Combinações comuns

7

Construído a partir dos tokens acima — sem biblioteca necessária.

strftimeLDMLCampoRenderiza como
%Fyyyy-MM-ddData ISO2026-03-09
%THH:mm:ssTempo de 24 horas14:05:07
%FT%T%:zyyyy-MM-dd'T'HH:mm:ssXXXTimestamp ISO 8601 completoO formato para armazenar. Classifica como texto, inequívoco sobre o deslocamento.2026-03-09T14:05:07+00:00
%a, %d %b %Y %T %zEEE, dd MMM yyyy HH:mm:ss ZZRFC 2822 — cabeçalhos de e-mail e HTTP mais antigosMon, 09 Mar 2026 14:05:07 +0000
%m/%d/%YMM/dd/yyyyConvenção dos EUA, mês primeiro03/09/2026
%d.%m.%Ydd.MM.yyyyConvenção europeia, dia primeiro09.03.2026
%%''Um sinal de porcentagem literal%

FAQ

Qual é a diferença entre yyyy e YYYY?
No LDML, yyyy é o ano do calendário e YYYY é o ano de numeração de semana ISO. Eles diferem por alguns dias em cada janeiro: 2027-01-01 cai na semana ISO 53 de 2026, então YYYY lê 2026 lá. Usar YYYY por acidente produz um bug que aparece uma vez por ano e depois desaparece, o que torna tão difícil de detectar.
Por que meu mês está aparecendo como minutos?
Porque você está em um dialeto LDML e usou mm em vez de MM. LDML é sensível a maiúsculas e minúsculas: M é mês, m é minuto, D é dia do ano, d é dia do mês. strftime tem a mesma armadilha em um lugar diferente — %M é minutos e %m é o mês.
Como faço para obter um número preenchido ou sem preenchimento?
Em strftime, a extensão GNU %-d remove o preenchimento, então %d é 09 e %-d é 9. No LDML, a contagem de letras define a largura diretamente: d é 9 e dd é 09. Nenhum é portável — %-d não existe em todas as plataformas.
Qual formato devo armazenar datas?
ISO 8601 com um deslocamento explícito — 2026-03-09T14:05:07+00:00. Classifica corretamente como texto, é inequívoco sobre o deslocamento, e cada idioma o analisa. Armazene isso e formate para exibição no último momento possível; uma data local armazenada sem um deslocamento é uma perda de informações irrecuperável.