ISO 8601日期格式中,T字符是否是必需的?

63
我想知道以下日期是否符合ISO8601标准:
2012-03-02 14:57:05.456+0500

(当然,2012-03-02T14:57:05.456+0500是符合标准的,但并不易于人类阅读!) 也就是说,在日期和时间之间必须有一个"T"吗?


3
ISO标准在人类可读性方面是荒谬的。下划线 (low dash) _T 更好:2012-03-02_14:57:05.456+0500 - Rodolfo
2019年版的ISO-8601标准将**T**设为强制性。我已经更新了我的答案。 - Keith Thompson
1
@Rodolfo ISO 8601标准主要用于交换数据时间值,而不是向人类用户展示。您应该为演示进行本地化。ISO 8601规范的标题包括:信息交换的表示形式 - Basil Bourque
3个回答

54

除非“信息交换伙伴”同意省略,否则必须使用它。

引用ISO 8601标准的早期版本,第4.3.2节:

在这些表达式中,字符[T]应作为时间指示符号,表示一天中时间组成部分的开始。[...]

注:如果信息交换双方相互同意,在没有与本国际标准定义的其他日期和时间表示形式混淆的风险的应用程序中,可以省略字符[T]。

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

但根据维基百科

在ISO 8601:2004中,双方可以协商省略"T"字符,例如"200704051430",但这一规定在ISO 8601-1:2019中被删除。在ISO 8601中不允许使用空格等其他字符分隔日期和时间部分,但在其配置文件RFC 3339中允许使用。更新:Mark Amery的评论指出了一个很好的观点,即允许省略[T]并不一定意味着允许用空格替换它。因此,以下内容是:
2012-03-02T14:57:05.456+0500

非常符合要求,而这个:

2012-03-0214:57:05.456+0500

如果合作伙伴同意删除T,那么早期版本的标准允许使用was,但是这样做:

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

显然这并不是最佳做法(尽管比完全省略T可读性更高)。个人而言,如果需要符合ISO 8601标准,我会加上T;如果不需要,则使用空格(或破折号,如果它将成为文件名的一部分)。另请参阅RFC 3339第5.6节,Charles Burns's answer中提到。

24

正如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.

6
RFC 3339 允许这种方式的事实相当荒谬;看起来 RFC 3339 的作者的意图是要创建一个比 ISO 8601 更加严格的标准,同时确保所有的 RFC 3339 日期时间仍符合 ISO 8601 的语法规则......但他们随机决定通过以这种微小、无意义的方式使 RFC 3339 的语法更加宽容而破坏了这个目标。我不理解;对我来说,这是一个显然愚蠢的决定,我无法理解它是如何做出的。但不管我是否喜欢,它已经被做出了,所以这个答案很遗憾地是正确的。 - Mark Amery
5
我认为这个注释并没有放松日期时间的语法,而是指出协议可以选择分别使用完整日期和完整时间,而不一定要使用日期时间。例如,一个协议可以选择将 timestamp_header ::= "Timestamp:" date-time 定义为 timestamp_header ::= "Timestamp:" full-date " " full-time。请注意,这里的翻译尽可能保留了原文的意思和结构,同时让其更通俗易懂。 - Adam M. Costello

0
ISO 8601日期和时间格式旨在同时适用于人类和机器阅读。在结构化查询语言(SQL)中,这是一种标准化的编程语言,用于所有标准计算机数据库,ISO 8601日期和时间格式在SQL中为"YYYY-MM-DD HH:MM:SS",始终不带时间之前的"T"。
以下是实际的ISO 8601日期和时间格式规范: https://www.iso.org/iso-8601-date-and-time-format.html 以下是SQL中的日期和时间格式: https://www.w3schools.com/sql/sql_dates.asp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接