ISO 8601

Formato de data e hora ISO 8601 explicado

ISO 8601 é o padrão internacional para representar datas e horas como cadeias. A sua forma canónica — 2024-03-15T14:30:00Z — é inequívoca, ordenável e suportada em todas as linguagens e bases de dados modernas. Este guia cobre o formato componente a componente, o subconjunto RFC 3339 que a maioria das APIs realmente usa, a nova extensão de fuso RFC 9557, e as variantes para durações, intervalos e datas de semana.

O que é ISO 8601?

ISO 8601 é a representação de datas e horas da Organização Internacional de Normalização. A versão atual (ISO 8601-1:2019 / -2:2019) define um formato de texto compacto, ordenado e neutro quanto à língua. Todo o seu propósito é eliminar a ambiguidade: uma data como 03/04/2024 é 4 de março nos EUA e 3 de abril em grande parte da Europa, mas 2024-03-04 significa o mesmo em todo o lado. O padrão é também a base de RFC 3339, o perfil que a maioria dos protocolos de internet realmente usa.

  • Ordem ano-mês-dia, sempre: 2024-03-15 (não 03/15/2024 nem 15/03/2024)
  • Parte da hora separada por um T literal ou um espaço: 2024-03-15T14:30:00
  • Fuso explícito: Z para UTC, ou ±HH:MM para um deslocamento
  • Ordenável como texto — a ordem lexicográfica coincide com a cronológica

O formato canónico de data-hora

A forma mais comum parece-se com 2024-03-15T14:30:00.123Z. Cada componente tem largura fixa e zeros à esquerda, e é isso que torna o formato ordenável e inequívoco.

ComponenteExemploSignificado
YYYY2024Ano de quatro dígitos
MM03Mês de dois dígitos (01–12)
DD15Dia de dois dígitos (01–31)
TTSeparador data/hora (RFC 3339 também permite um espaço)
hh:mm:ss14:30:00Hora de 24 h, com zeros à esquerda
.fff.123Segundos fracionários opcionais (precisão arbitrária em ISO 8601)
Z ou ±hh:mmZDesignador de fuso (Z = UTC = +00:00)

Designadores de fuso horário

Os fusos de ISO 8601 são codificados como deslocamentos em relação ao UTC, nunca como abreviaturas de fuso tipo EST ou CET (que são ambíguas). A cadeia transporta informação suficiente para reconstruir o instante UTC exato, incluindo os deslocamentos de meia hora e de 45 minutos que algumas regiões usam.

DesignadorDeslocamento do UTCFuso de exemplo
Z+00:00UTC (hora "Zulu")
+09:009 horas à frenteHora padrão do Japão
-05:005 horas atrásHora padrão do Leste (EUA)
+05:305,5 horas à frenteHora padrão da Índia
+05:455,75 horas à frenteHora padrão do Nepal
(nenhum)não especificadoHora local — ambígua; evitar em APIs

ISO 8601 vs RFC 3339

RFC 3339 é um perfil de ISO 8601 — mais restritivo e mais fácil de analisar. A maioria dos protocolos de internet (APIs JSON, HTTP, especificações IETF) visa especificamente RFC 3339, por isso quando uma API diz "ISO 8601" quase sempre se refere ao subconjunto RFC 3339. As diferenças são pequenas mas decidem se uma dada cadeia é analisada.

CaracterísticaISO 8601RFC 3339
Separador data/horaT, ou omitido no formato básicoT ou um único espaço (obrigatório)
Deslocamento de fusoOpcionalObrigatório
Segundos fracionáriosPrecisão arbitráriaPermitidos, limitados pelo analisador
Formato básico (sem hífenes)20240315T143000Z permitidoNão permitido
Datas de semana/ordinaisPermitidasNão permitidas
Uso típicoArquivos, folhas de cálculo, intercâmbioAPIs JSON, HTTP, especificações IETF

RFC 9557: os fusos e a extensão Temporal

Um deslocamento simples como +01:00 diz-te o instante mas não o fuso — e os deslocamentos mudam com o horário de verão, por isso o mesmo fuso é +01:00 no inverno e +02:00 no verão. RFC 9557 (2024) fecha essa lacuna com o Internet Extended Date/Time Format (IXDTF): acrescenta o nome de fuso IANA entre parênteses retos, como em 2024-03-15T14:30:00+01:00[Europe/Paris]. É o formato de cadeia que a API Temporal do JavaScript lê e escreve, por isso vê-lo-ás mais à medida que a adoção do Temporal cresce. Mantém-se retrocompatível — remove o sufixo entre parênteses e tens um timestamp RFC 3339 comum.

  • Só deslocamento: 2024-03-15T14:30:00+01:00 — o instante, mas não o fuso
  • IXDTF (RFC 9557): 2024-03-15T14:30:00+01:00[Europe/Paris] — instante mais fuso
  • Retrocompatível: a etiqueta entre parênteses pode ser ignorada pelos analisadores RFC 3339

Variantes: durações, intervalos, datas de semana

ISO 8601 cobre mais do que instantes. Várias variantes aparecem com regularidade em sistemas de planeamento, arquivo e relatórios:

  • Durações: P3Y6M4DT12H30M5S = 3 anos, 6 meses, 4 dias, 12 horas, 30 minutos, 5 segundos
  • Intervalos: 2024-01-01/2024-02-01, ou 2024-01-01/P1M (início + duração)
  • Datas ordinais: 2024-075 = o 75.º dia de 2024 (15 de março)
  • Datas de semana: 2024-W11-5 = sexta-feira da semana ISO 11 de 2024
  • Intervalos repetidos: R3/2024-01-01/P1D = três intervalos de um dia a partir de 1 de janeiro

ISO 8601 no código

Qualquer linguagem comum consegue produzir e analisar o subconjunto RFC 3339 de origem. O hábito mais seguro é emitir em UTC com um Z e voltar a analisar para um instante, deixando qualquer conversão de fuso para a camada de apresentação.

  • JavaScript emitir: new Date().toISOString() // '2024-03-15T14:30:00.123Z'
  • JavaScript analisar: new Date('2024-03-15T14:30:00Z') // subconjunto RFC 3339
  • Python emitir: datetime.now(timezone.utc).isoformat()
  • Python analisar: datetime.fromisoformat('2024-03-15T14:30:00+00:00') // ISO completo em 3.11+
  • A maioria das bases de dados (Postgres, SQLite) aceita e devolve ISO 8601 timestamptz diretamente

Erros comuns em ISO 8601

Mesmo com um padrão estrito, o código de análise e emissão comete o mesmo punhado de erros:

  • Omitir o fuso: 2024-03-15T14:30:00 sem Z nem deslocamento é ambíguo
  • Usar "+0000" em vez de "+00:00" — alguns analisadores aceitam, RFC 3339 não
  • Usar um T que não é letra (os sósias Unicode copiam-se mal)
  • Misturar AM/PM de 12 h em ISO 8601 — é sempre de 24 h
  • Truncar segundos fracionários sem arredondar — escolhe uma precisão e mantém-na
  • Tratar ISO 8601 como dependente da localização — não é; o formato é fixo independentemente da língua

Referências relacionadas

FAQ

"2024-03-15 14:30:00Z" é ISO 8601 válido?
Sim — o espaço entre a data e a hora é permitido em ISO 8601 (e em RFC 3339). A forma com T é preferível para uma análise por máquina inequívoca.
O que significa o Z no final?
Z significa UTC (deslocamento +00:00). É a abreviatura de "hora Zulu", o alfabeto fonético NATO/aviação para a letra Z.
Como analiso ISO 8601 em JavaScript?
new Date("2024-03-15T14:30:00Z") funciona para o subconjunto RFC 3339 padrão. Para suporte ISO 8601 mais amplo, usa uma biblioteca como date-fns ou a API Temporal.
ISO 8601 é o mesmo que RFC 3339?
Não — RFC 3339 é um subconjunto estrito. Todo timestamp RFC 3339 é ISO 8601 válido, mas nem todo timestamp ISO 8601 é RFC 3339 válido.
O que é RFC 9557?
RFC 9557 (2024) estende RFC 3339 com o Internet Extended Date/Time Format (IXDTF). Acrescenta o nome de fuso IANA entre parênteses retos — por exemplo 2024-03-15T14:30:00+01:00[Europe/Paris] — e sustenta o formato de cadeia usado pela API Temporal do JavaScript.
O separador T é obrigatório?
Em ISO 8601 estrito, o T pode ser omitido no formato básico; RFC 3339 exige um T ou um único espaço. Para análise por máquina, inclui sempre o T.
Qual é a diferença entre ISO 8601 e ISO 8601-2?
ISO 8601-1 cobre a representação básica de datas e horas. ISO 8601-2 (a extensão de 2019) acrescenta novas construções como datas incertas, valores qualificadores e intervalos complexos.