Qual é a diferença entre os formatos de data ISO 8601 e RFC 3339?

280

ISO 8601 e RFC 3339 parecem ser dois formatos comuns na web. Devo usar um sobre o outro? Um é apenas uma extensão? Eu realmente preciso me importar tanto assim?

Mark Amery
fonte
42
Alterei o link para o RFC de ietf.org/rfc/rfc3339.txt para a versão HTML em tools.ietf.org/html/rfc3339 . Ao vincular às RFCs, você sempre deve vincular as versões HTML em tools.ietf.org/html . Além de serem mais fáceis de navegar, graças aos links das seções, eles também listam no topo os RFCs que atualizaram ou obsoletos o RFC que você está lendo. Inconscientemente, as pessoas citam RFCs obsoletos o tempo todo no Stack Overflow, e vou continuar repetindo esse conselho até que esse problema desapareça. (Para que não restem dúvidas, esta RFC não é obsoleto.)
Mark Amery

Respostas:

238

Um é apenas uma extensão?

Praticamente, sim - o RFC 3339 está listado como um perfil da ISO 8601. O mais notável é que o RFC 3339 especifica uma representação completa da data e hora (apenas segundos fracionários são opcionais). O RFC também possui algumas diferenças pequenas e sutis. Por exemplo, representações truncadas de anos com apenas dois dígitos não são permitidas - a RFC 3339 requer anos com quatro dígitos e a RFC permite apenas que um caractere de ponto seja usado como ponto decimal por segundos fracionários. O RFC também permite que o "T" seja substituído por um espaço (ou outro caractere), enquanto o padrão apenas permite que ele seja omitido (e somente quando houver acordo entre todas as partes usando a representação).

Eu não me preocuparia muito com as diferenças entre os dois, mas, na hipótese de o seu caso de uso chegar a eles, valeria a pena dar uma olhada em:

ConroyP
fonte
11
Por outro lado, a ISO permite omitir 'T', mas o RFC 3339 o manda tools.ietf.org/html/rfc3339#page-12
Java Guy
21
Desculpe Java Guy, mas isso não está correto. O apêndice ao qual você se refere é apenas informativo e a restrição é para manter a gramática mais simples. A nota no final da seção 5.6 afirma claramente que um espaço pode ser usado para facilitar a leitura, referindo-se à menção anterior de legibilidade, que é o assunto da seção 5.2. para citar: "Os aplicativos que usam essa sintaxe podem escolher, para facilitar a leitura, especificar uma data e um horário completos separados por (digamos) um caractere de espaço".
Greg A. Woods,
8
@JavaGuy O apêndice ao qual você se vinculou nem fala sobre a sintaxe da RFC 3339 - é intitulado ISO 8601 Collected ABNF e é uma tentativa de descrever formalmente a gramática da ISO 8601 usando o ABNF . Nada do que diz deve ser tomado como evidência sobre a sintaxe de data e hora da RFC 3339.
Mark Amery
3
FWIW: Tem sido discutido na lista coreutils: lists.gnu.org/archive/html/bug-coreutils/2006-05/msg00019.html
Frederick Nord
9
Eu sou o autor que Justin (comentário anterior) entrou em contato (embora não seja responsável pela maior parte do trabalho pesado lá). Eu confirmo o seu comentário. Geralmente, gostaria de sugerir documentos de especificação como RFC3339 especificar em vez de exigir - é o contexto de uso que determina o que é necessário . Desde que fique claro o que se pretende, a referência a uma produção de sintaxe específica é boa. (Isso não é realmente diferente do que o próprio RFC3339 faz ao fazer referência seletiva à ISO8601.) Consulte também a NOTA na seção 5.6 .
Graham Klyne
20

O RFC 3339 é principalmente um perfil da ISO 8601, mas na verdade é inconsistente com o empréstimo da especificação de fuso horário "-00: 00" da RFC 2822. Isso é descrito no artigo da Wikipedia.

Zefram
fonte
4

Você não deveria ter que se importar tanto. A RFC 3339, de acordo com ela mesma, é um conjunto de padrões derivados da ISO 8601. Porém, existem algumas diferenças minuciosas e todas estão descritas na RFC 3339. Eu poderia passar por todas elas aqui, mas você provavelmente faria melhor basta ler o documento por si mesmo, caso esteja preocupado:

http://tools.ietf.org/html/rfc3339

David Morton
fonte