389

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

4

5 回答 5

311

一个只是扩展吗?

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

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

于 2009-02-06T21:37:04.437 回答
49

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

对于您的问题:

一个只是扩展吗?

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

我应该使用其中一个吗?

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

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

我真的需要关心那么糟糕吗?

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

于 2020-12-09T16:47:38.923 回答
20

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

于 2013-03-11T12:59:08.407 回答
2

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

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

于 2021-04-02T14:33:14.543 回答
1

你不应该那么在意。就其本身而言,RFC 3339 是一组源自 ISO 8601 的标准。尽管存在相当多的细微差别,它们都在 RFC 3339 中进行了概述。我可以在这里全部介绍,但您可能会做得更好如果您担心,请自行阅读文档:

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

于 2009-02-06T21:32:26.113 回答