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

249 format datetime web-standards

ISO 8601RFC 3339似乎是网络常见的两种格式.我应该使用一个吗?一个只是一个扩展吗?我真的需要关心那么糟糕吗?

Con*_*oyP 210

一个只是一个扩展吗?

差不多,是的 - RFC 3339被列为ISO 8601的配置文件.最值得注意的是RFC 3339需要完整的表示的日期和时间(只有小数秒是可选的).RFC也有一些细微的差别.例如,不允许截断只有两位数的年份表示 - RFC 3339需要4位数年份,RFC只允许将句点字符用作小数秒的小数点.RFC还允许将"T"替换为空格(或其他字符),而标准仅允许省略(并且仅当使用该表示的所有各方之间达成一致时).

我不会太担心两者之间的差异,但是如果你的用例遇到它们的可能性很大,那么值得你一瞥:

  • 对不起Java Guy,但这不太正确.您引用的附录仅供参考,限制是为了保持语法更简单.5.6节末尾的注释清楚地表明,为了便于阅读,可以使用一个空格,参考前面提到的可读性,这是第5.2节的主题.引用:"为了便于阅读,使用这种语法的应用程序可以选择指定由(例如)空格字符分隔的完整日期和全时间." (17认同)
  • 另一方面,ISO允许省略'T'但RFC 3339要求它http://tools.ietf.org/html/rfc3339#page-12 (11认同)
  • @JavaGuy您链接到的附录甚至没有谈论RFC 3339语法 - 它标题为**ISO 8601 Collected ABNF**,并试图使用[ABNF](https)正式描述*ISO 8601*的语法://tools.ietf.org/html/rfc5234).它所说的任何内容都不应被视为RFC 3339 datetime语法的证据. (6认同)
  • 我是Justin(先前的评论)联系的作者(尽管不负责那里的大部分繁重工作)。我确认他的评论。通常,我会建议像RFC3339这样的规范文档,而不是* require *,而不是* require *-这是使用上下文来确定* required *是什么。只要明确了目标,就可以引用特定的语法。(这与RFC3339本身对选择ISO8601的选择性引用并没有什么不同。)另请参见[5.6节](https://tools.ietf.org/html/rfc3339#section-5.6)中的注释。 (5认同)
  • “RFC 3339 需要完整的日期和时间表示”——这是不正确的。请考虑编辑答案。我给一位 RFC 作者发了电子邮件,只是为了完全确定。回复包括“如果您只需要一个日期戳,我认为参考 [RFC3339] 'full-date' 语法生成是完全公平的游戏。......也许可能有一个勘误表”此外,JSON Schema v7 明确支持 RFC 3339 个仅限日期(full-date)和仅限时间(full-time)的配置文件。https://json-schema.org/draft-07/json-schema-release-notes.html。 (3认同)
  • FWIW:已在coreutils列表中进行了讨论:http://lists.gnu.org/archive/html/bug-coreutils/2006-05/msg00019.html (2认同)
  • “最值得注意的是 RFC 3339 需要日期和时间的_完整表示_”我不确定这意味着什么。RFC 3339 明确允许 ISO 8601 结构,如“YYYY”、“YYYY-MM”、“--MM-DD”等。语法是`date = datespec-full / datespec-year / datespec-month / datespec-mday / datespec-week / datespec-wday / datespec-yday`。 (2认同)

cla*_*lay 22

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 不允许这样做。

对于您的问题:

一个只是一个扩展?

否。如上所示,每个标准都支持其他标准不支持的语法变体。所以一种语法不是另一种语法的超集或扩展。

我应该使用一个吗?

当然这取决于你的场景。一个安全的一般策略是生成两个标准都有效的日期时间字符串。

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

我真的需要那么在意吗?

好吧,这取决于你。大多数处理日期时间字符串的常规开发人员应该有较高的理解,但不需要深入研究细节。


小智 18

RFC 3339主要是ISO 8601的配置文件,但实际上与借用RFC 2822中的"-00:00"时区规范不一致.这在Wikipedia文章中有所描述.


小智 6

实际访问 ISO 规范似乎很困难和/或昂贵。这就是为什么我们看到许多指向维基百科页面的链接。

仅出于这个原因,我更喜欢 RFC3339:您可以直接访问主要来源。