ISO 8601和RFC 3339日期格式有什么区别?

464

ISO 8601RFC 3339 是 web 常用的两种日期时间格式。我应该选择哪一种呢?它们之间只是扩展关系吗?我真的需要这么在意吗?


91
我把链接从http://www.ietf.org/rfc/rfc3339.txt改成了HTML版本的链接http://tools.ietf.org/html/rfc3339。在链接到RFC时,你应该总是链接到http://tools.ietf.org/html下的HTML版本。它们不仅可以通过章节链接更容易地导航,而且重要的是,它们会在顶部列出任何更新或废除你正在阅读的RFC的RFC。人们经常在Stack Overflow上不知情地引用过时的RFC,直到这个问题被解决之前,我将一直重复这个建议。(为了避免疑义,这个 RFC没有过时。) - Mark Amery
4
这是一篇很好的文章,用于解释它们之间的区别:https://ijmacd.github.io/rfc3339-iso8601/ - Fangda Han
https://ijmacd.github.io/rfc3339-iso8601/ - Ray Hulha
5个回答

355
基本上是这样的,是RFC 3339的一个规范。最值得注意的是RFC 3339指定了日期和时间的完整表示(只有小数秒是可选的)。RFC还有一些细微的差异。例如,不允许使用仅具有两位数字的年份的截断表示 - RFC 3339要求4位数字的年份,并且RFC仅允许使用句点字符作为小数秒的小数点。RFC还允许用空格(或其他字符)替换“T”,而标准仅允许省略它(并且仅当所有使用该表示的各方达成协议时)。
我不会过分担心两者之间的差异,但万一您的用例遇到它们,看一眼以下内容肯定是值得的:

29
抱歉Java Guy,但那并不完全正确。你提到的附录仅供信息参考,限制是为了保持语法简单。在第5.6节末尾的注释清楚地指出,为了易读性可以使用空格,并引用了第5.2节讨论的易读性主题。引用:“使用此语法的应用程序可以选择为了易读性而指定由(例如)一个空格字符分隔的完整日期和完整时间。” - Greg A. Woods
10
你提供的附录并不是在讨论 RFC 3339 语法,它的标题是“ISO 8601 Collected ABNF”,旨在使用 ABNF 对 ISO 8601 的语法进行形式化描述。其中的内容不能作为证据来说明 RFC 3339 日期时间语法。 - Mark Amery
3
这个信息已经在coreutils列表中讨论过:http://lists.gnu.org/archive/html/bug-coreutils/2006-05/msg00019.html。FWIW是一个缩写,意思是“For What It's Worth”,可以理解为“顺便说一句”。 - Frederick Nord
4
“RFC 3339 requires a complete representation of date and time”这句话不正确,请考虑对答案进行编辑。我给RFC的一位作者发了电子邮件,以确保完全正确。回复中包括:“如果你只想要日期戳,我认为引用[RFC3339]‘full-date’语法产生是完全可以的...也许需要勘误表。”此外,JSON Schema v7明确支持RFC 3339仅包括日期(full-date)和时间(full-time)部分的规范。https://json-schema.org/draft-07/json-schema-release-notes.html。 - Justin Maxwell
20
我是Justin(前面的评论)联系的作者(虽然在那里并不负责大部分的工作)。我确认他的评论。一般来说,我建议像RFC3339这样的规范文档指定而不是要求 - 是使用上下文决定了什么是必需的。只要清楚了意图,引用特定的语法结构就可以了。(这实际上与RFC3339本身所做的选择性参考ISO8601并没有什么不同。)另请参见[section 5.6](https://tools.ietf.org/html/rfc3339#section-5.6)中的注释。 - Graham Klyne
显示剩余2条评论

111
ISO 8601和RFC 3339之间有很多差异。以下是一些例子,以便让您了解:

2020-12-09T16:09:53+00:00是符合两个标准的日期时间值。

2020-12-09 16:09:53+00:00使用空格分隔日期和时间,RFC 3339允许,但ISO 8601不允许。

2020-12-09T16:09:53-00:00指定时间偏移为负零,RFC 3339允许,但ISO 8601不允许。

20201209T160953Z省略连字符和冒号,ISO 8601允许,但RFC 3339不允许。

ISO 8601允许使用序数日期,例如2020-344表示2020年第344天。RFC 3339不允许这样做。

回答您的问题:

它们只是一个扩展吗?

不是。如上所示,每个标准都支持另一个标准不支持的语法变化。因此,一个语法不是另一个语法的超集或扩展。

我应该使用哪一个?

当然,这取决于您的情况。一个安全的通用策略是生成符合两个标准的日期时间字符串。

另一个好的通用策略是使用现有的标准库来解析/格式化日期时间字符串,而不是编写自定义实现,除非您正在处理真正的定制场景。

我真的需要关注这个问题吗?

这取决于你。大多数处理日期时间字符串的普通开发人员应该具有较高水平的理解,但不需要深入了解细节。


谢谢!这很清楚地指出了差异,这应该是最佳答案。 - undefined

22

RFC 3339基本上是ISO 8601的一个配置文件,但它从RFC 2822借用了"-00:00"时区规范,并与之不一致。这在维基百科文章中有描述。


6

似乎很难和/或昂贵地获得访问ISO规范的权限。这就是为什么我们经常看到链接到维基百科页面。

光是出于这个原因,我更喜欢RFC3339:你可以直接查阅主要来源。


1

你不必太在意。RFC 3339是一组从ISO 8601衍生出来的标准。虽然存在一些微小的差异,但它们都在RFC 3339中有详细说明。我可以在这里逐一解释,但如果你担心的话,最好自己阅读文档:

https://www.rfc-editor.org/rfc/rfc3339


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接