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.
| Componente | Exemplo | Significado |
|---|---|---|
| YYYY | 2024 | Ano de quatro dígitos |
| MM | 03 | Mês de dois dígitos (01–12) |
| DD | 15 | Dia de dois dígitos (01–31) |
| T | T | Separador data/hora (RFC 3339 também permite um espaço) |
| hh:mm:ss | 14:30:00 | Hora de 24 h, com zeros à esquerda |
| .fff | .123 | Segundos fracionários opcionais (precisão arbitrária em ISO 8601) |
| Z ou ±hh:mm | Z | Designador 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.
| Designador | Deslocamento do UTC | Fuso de exemplo |
|---|---|---|
| Z | +00:00 | UTC (hora "Zulu") |
| +09:00 | 9 horas à frente | Hora padrão do Japão |
| -05:00 | 5 horas atrás | Hora padrão do Leste (EUA) |
| +05:30 | 5,5 horas à frente | Hora padrão da Índia |
| +05:45 | 5,75 horas à frente | Hora padrão do Nepal |
| (nenhum) | não especificado | Hora 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ística | ISO 8601 | RFC 3339 |
|---|---|---|
| Separador data/hora | T, ou omitido no formato básico | T ou um único espaço (obrigatório) |
| Deslocamento de fuso | Opcional | Obrigatório |
| Segundos fracionários | Precisão arbitrária | Permitidos, limitados pelo analisador |
| Formato básico (sem hífenes) | 20240315T143000Z permitido | Não permitido |
| Datas de semana/ordinais | Permitidas | Não permitidas |
| Uso típico | Arquivos, folhas de cálculo, intercâmbio | APIs 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.