在 ISO 8601 日期中,T 字符是强制性的吗?

Posted

技术标签:

【中文标题】在 ISO 8601 日期中,T 字符是强制性的吗?【英文标题】:In an ISO 8601 date, is the T character mandatory? 【发布时间】:2012-03-20 20:26:20 【问题描述】:

我想知道以下日期是否符合 ISO8601:

2012-03-02 14:57:05.456+0500

(当然,2012-03-02T14:57:05.456+0500 是合规的,但人类可读性并不高!) IOW,日期和时间之间的 T 是强制性的吗?

【问题讨论】:

从人类可读性的角度来看,ISO 标准是荒谬的。下划线(低破折号)_ 会比T 好得多:2012-03-02_14:57:05.456+0500 【参考方案1】:

除非“信息交换合作伙伴”同意省略,否则为必填项。

引用ISO 8601 standard,第 4.3.2 节:

字符 [T] 应用作时间指示符来指示 在这些中开始表示一天中的时间组件 表达式。 [...]

注意根据信息交换合作伙伴的相互协议, 字符 [T] 在应用中可以省略 将日期和时间表示与其他人混淆的风险 在本国际标准中定义。

省略它是相当常见的,但如果表示是机器可读的,并且您没有明确同意可以省略它,则建议保留它。

更新:Mark Amery 的评论提出了一个很好的观点,允许省略 [T] 并不一定意味着允许用空格替换它。所以这个:

2012-03-02T14:57:05.456+0500

显然是合规的,并且:

2012-03-0214:57:05.456+0500

如果合作伙伴同意省略 [T] 则允许,但是:

2012-03-02 14:57:05.456+0500

显然不是(尽管它比简单地省略 [T] 的版本更具可读性)。

就个人而言,如果需要符合 ISO 8601 标准,我会包含 [T],如果不是,我会使用空格(或者如果它将成为文件名的一部分,则使用连字符)。我的猜测,仅此而已,其目的是允许将“T”替换为空格,但标准并没有这么说。

另见RFC 3339 5.6 节,在Charles Burns's answer 中提到。

【讨论】:

【参考方案2】:

正如 Keith Thompson 所说,该日期不符合 ISO-8601,但它符合 RFC 3339,即 ISO 8601 的配置文件。 有点。请参阅RFC 3339以下文本底部的注释:

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

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

  This date/time format may be used in some environments or contexts
  that distinguish between the upper- and lower-case letters 'A'-'Z'
  and 'a'-'z' (e.g. XML).  Specifications that use this format in
  such environments MAY further limit the date/time syntax so that
  the letters 'T' and 'Z' used in the date/time syntax must always
  be upper case.  Applications that generate this format SHOULD use
  upper case letters.

  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.

【讨论】:

RFC 3339 允许这样做的事实非常荒谬;似乎 RFC 3339 的作者的意图是创建一个比 ISO 8601 严格 更严格 的标准,同时确保所有 RFC 3339 日期时间仍然符合 ISO 8601 的语法......但随后他们随机决定鱼雷通过以这种微小的、毫无意义的方式使 RFC 3339 语法比 ISO 8601 更宽松,从而实现该目标。我不明白;对我来说,这显然是一个愚蠢的决定,我无法理解它是如何做出的。但不管我喜不喜欢,所以这个答案很遗憾是正确的。 我不认为注释放宽了日期时间的语法,而是指出如果协议更喜欢使用完整日期,则不需要使用日期时间和全职分开。例如,协议可以选择像 timestamp_header ::= "Timestamp:" full-date " " full-time 那样定义它,而不是定义像 timestamp_header ::= "Timestamp:" date-time 这样的东西。

以上是关于在 ISO 8601 日期中,T 字符是强制性的吗?的主要内容,如果未能解决你的问题,请参考以下文章

iOS-时间格式ISO 8601

Tabulator 5.0 - 解析日期时间 luxon - 日期时间 ISO 8601

Google 表格单元格中的 ISO-8601 字符串到日期

如何解析 ISO 8601 格式的日期?

在django tables2中解析ISO 8601日期格式

如何使用 PHP 将日期显示为 iso 8601 格式