我很困惑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.
这很令人困惑。这不仅允许一个空格字符,还允许任何字符吗?这就是这个CCD_ 4所暗示的。还是this syntax
引用了ISO8601,不必要地描述了其他标准的细节?
换句话说,以下是有效的RFC3339字符串吗?
2020-09-07 20:26:03.623359300+02:00
2020-09-07hey johnny20:26:03.623359300+02:00
2020-09-07💩20:26:03.623359300+02:00
意味着大写
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
这样,用户可能更容易看到日期和时间之间的空白,因此他们不必查找T
或t
字符来找到分隔符。这确实是一个模糊的句子,因为它基本上意味着应用程序可以做任何事情。
回答您的问题:根据RFC 3339,这些列出的日期格式无效。
简短回答:T
(或t
作为不推荐的替代方案(。
在我尽可能多地阅读之后,发现时间分隔符必须是T
或t
。首先,在GNU列表中,F.Alexander Njemz联系了RFC3339的作者Graham Klyne和Chris Newman,询问T
是否是强制性的,并从Klyne先生那里得到了以下回复:
简而言之:;是";
根据第5.5节,本草案的目的是使用元素与8601兼容,但消除了合理的任何可能使时间戳数据更难获取的变化过程这包括在日期+时间值中强制使用"T"。
#g
为了清楚起见,这在第5.5节:中有说明
通过制作大多数字段和标点符号来实现简洁强制性的
这显然与非强制性的T
相冲突,并强烈地让我认为有问题的段落中的this syntax
指的是ISO8601,而不是RFC3339。
对于那些想阅读更多的人来说,这里有一些关于这一点造成的困惑的链接:
- https://lists.gnu.org/archive/html/bug-coreutils/2006-05/msg00014.html
- http://validator.w3.org/feed/docs/error/InvalidRFC3339Date.html
- https://www.rfc-editor.org/errata/eid5783
当然还有不同的实现。例如,GNU Date的开发人员选择使用一个空格字符:
$ date --rfc-3339=seconds
2020-09-14 14:53:51+02:00