可以在ISO8601字符串中检测日期和时间格式吗?

时间:2018-02-21 19:53:41

标签: date datetime iso8601

找到能够解析ISO8601中提供的时间或日期和时间的图书馆是微不足道的。它们似乎意味着它们可以配置为解析 ISO8601的一种格式,例如通过手工滚动合适的字符串格式代码。

但实际上ISO8601定义了各种可能的格式来表示日期和时间。例如,提供一个非常简短的变体列表:

  • 各种分隔符是可选的或允许使用不同的字符(例如,您可以在日期和时间部分之间使用空格或" T"并且可以在日期组件之间省略连字符)
  • 你可以用不同程度的精确度来表示时刻,以便" 2018"是一个有效的ISO8601字符串,我相信
  • 您可以通过每月,一年或一周的数字指定时间
  • 您可以通过各种方式指定时区偏移(例如," +01:00"," + 0100"或" + 01")
  • 等。

您几乎可以说,ISO8601定义了一个完整的DSL来表示日期和时间。如果你只知道一个字符串是ISO8601格式的时间,你就不太了解。

所以我想知道的是:你能读一个字符串,只知道它是用一些ISO8601格式编码的,并可靠地推断哪种格式它正在使用?或者遗憾的是ISO8601格式的定义方式是解析器需要提前知道正在使用哪种格式?

1 个答案:

答案 0 :(得分:3)

这是一个有趣的问题,但答案总是。要解析字符串不仅要评估其字符,还要评估它们的特定意图。

换句话说,你会将它解析为?如果一个字符串可能包含日期,并且可能包含时间,并且可能包含UTC的偏移量,或者可能包含基于星期的值,或者可能包含一段经过的时间,并且可能包含包含一系列这样的句点,可能在一端有一个固定的点...这样一个可以解析所有的结果对象将不会非常有用。人们必须测试该对象的许多可选属性才能知道如何使用它。也许有人可能会使用这样的对象来验证字符串是否属于少数有效格式之一,但正则表达式更适合该任务。

值得一提的是,那些试图制定一个日期时间类型的语言通常都会让人后悔。考虑陷入此陷阱的java.util.Date。 Java开发人员现在应该知道他们应该使用java.time或Joda-Time。还要考虑XSD等模式语言,它们定义了各种各样的日期和时间类型,其中许多都与ISO8601兼容。如果只有一种类型,它会降低定义模式的目的。