1

对于RFC3339 标准中允许的时间分隔符/指示符,我感到非常困惑。时间分隔符是指在日期和时间之间划定界限的字符序列。

该标准在第 5.6 节中陈述了不清楚或相互矛盾的不同事物。首先,它说完整日期时间的生产规则是这样的:

date-time = full-date "T" full-time

这意味着日期和时间之间的分隔符是大写的T。紧随其后的是:

  NOTE: Per [ABNF] and ISO8601, the "T" and "Z" characters in this
  syntax may alternatively be lower case "t" or "z" respectively

意思是大写T 可能是小写t。它与 ABNF 冲突,但好吧,在我看来,它仍然在合理的范围内。然后声明如下

  NOTE: ISO 8601 defines date and time separated by "T".
  Applications using this syntax may choose, for the sake of
  readability, to specify a full-date and full-time separated by
  (say) a space character.

这非常令人困惑。这是否不仅允许空格字符,还允许任何内容?这就是这say意味着什么。还是this syntax参考 ISO8601 并不必要地描述了其他标准的细节?

换句话说,以下是有效的 RFC3339 字符串吗?

  • 2020-09-07 20:26:03.623359300+02:00
  • 2020-09-07hey johnny20:26:03.623359300+02:00
  • 2020-09-0720:26:03.623359300+02:00
4

2 回答 2

0

意思是大写T 可能是小写t。它与 ABNF 冲突,[...]

它不是。请参阅RFC 2234 的2.3 终端值:

Literal text strings are interpreted as a concatenated set of
printable characters.

   NOTE:     ABNF strings are case-insensitive and
             the character set for these strings is us-ascii.

所以这里允许使用t

  NOTE: ISO 8601 defines date and time separated by "T".
  Applications using this syntax may choose, for the sake of
  readability, to specify a full-date and full-time separated by
  (say) a space character.

这非常令人困惑。这是否不仅允许空格字符,还允许任何内容?

此“偏差”用于显示时用户的可读性。所以当值以某种形式显示给用户时,它可以显示为:

  • 2020-09-07 20:26:03.623359300+02:00
  • 2020-09-07, 20:26:03.623359300+02:00

这样,用户可能更容易看到日期和时间之间的空白,因此他们不必寻找Tort字符来找到分隔符。这确实是一个模糊的句子,因为它基本上意味着应用程序可以做任何事情。

回答您的问题:根据 RFC 3339,这些列出的日期格式无效。

于 2020-09-14T09:50:36.080 回答
0

简短回答:(Tt作为不鼓励的替代方案)。

在尽可能多地阅读之后,事实证明时间分隔符必须是 aTt。首先是GNU 列表中的这个线程,其中 F. Alexander Njemz 联系了 RFC3339 的作者 Graham Klyne 和 Chris Newman 询问是否T是强制性的,并从 Klyne 先生那里得到了这个回复:

简而言之:“是的”

根据第 5.5 节,本草案的目的是指定使用 8601 中的元素并与 8601 兼容的时间戳格式,但在合理的范围内消除可能使时间戳数据更难处理的任何变化。这包括在日期+时间值中强制使用“T”。

#G

为清楚起见,这在第 5.5 节中有说明:

通过强制大多数字段和标点符号来实现简单性。

这显然与非强制性相冲突,T并且强烈地让我认为那个this syntax有问题的段落中的 是指 ISO8601 而不是 RFC3339。

对于那些想了解更多信息的人,这里有一些关于这个特定点造成的混乱的链接:

加上当然不同的实现。例如,GNU Date 的开发者选择使用空格字符:

$ date --rfc-3339=seconds
2020-09-14 14:53:51+02:00
于 2020-09-14T10:03:22.843 回答