【问题标题】:What are valid date-time separators in RFC3339 strings?RFC3339 字符串中的有效日期时间分隔符是什么?
【发布时间】:2020-09-07 20:30:58
【问题描述】:

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

标准规定in section 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-07????20:26:03.623359300+02:00

【问题讨论】:

    标签: rfc3339


    【解决方案1】:

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

    它没有。请参阅 RFC 2234 的 2.3 Terminal Values

    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

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

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

    【讨论】:

    • 哦,谢谢,我不知道 ABNF 不区分大小写。至于“可读性”,我试图以这种方式理解它,但放弃了它,因为如何向用户显示日期时间与如何明确地交换日期时间无关,即(我猜) RFC 的目的。
    【解决方案2】:

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

    在我尽可能多地阅读之后,事实证明时间分隔符必须是Tt。首先是this thread in the GNU lists,F. Alexander Njemz 联系了 RFC3339 Graham Klyne 和 Chris Newman 的作者,询问T 是否是强制性的,并得到了 Klyne 先生的回复:

    简而言之:“是”

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

    #g

    为了清楚起见,这在section 5.5

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

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

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

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

    $ date --rfc-3339=seconds
    2020-09-14 14:53:51+02:00
    

    【讨论】:

      猜你喜欢
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 2014-06-10
      相关资源
      最近更新 更多