找到能够解析ISO8601中提供的时间或日期和时间的图书馆是微不足道的。它们似乎意味着它们可以配置为解析 ISO8601的一种格式,例如通过手工滚动合适的字符串格式代码。
但实际上ISO8601定义了各种可能的格式来表示日期和时间。例如,提供一个非常简短的变体列表:
您几乎可以说,ISO8601定义了一个完整的DSL来表示日期和时间。如果你只知道一个字符串是ISO8601格式的时间,你就不太了解。
所以我想知道的是:你能读一个字符串,只知道它是用一些ISO8601格式编码的,并可靠地推断哪种格式它正在使用?或者遗憾的是ISO8601格式的定义方式是解析器需要提前知道正在使用哪种格式?
答案 0 :(得分:3)
这是一个有趣的问题,但答案总是不。要解析字符串不仅要评估其字符,还要评估它们的特定意图。
换句话说,你会将它解析为?如果一个字符串可能包含日期,并且可能包含时间,并且可能包含UTC的偏移量,或者可能包含基于星期的值,或者可能包含一段经过的时间,并且可能包含包含一系列这样的句点,可能在一端有一个固定的点...这样一个可以解析所有的结果对象将不会非常有用。人们必须测试该对象的许多可选属性才能知道如何使用它。也许有人可能会使用这样的对象来验证字符串是否属于少数有效格式之一,但正则表达式更适合该任务。
值得一提的是,那些试图制定一个日期时间类型的语言通常都会让人后悔。考虑陷入此陷阱的java.util.Date
。 Java开发人员现在应该知道他们应该使用java.time
或Joda-Time。还要考虑XSD等模式语言,它们定义了各种各样的日期和时间类型,其中许多都与ISO8601兼容。如果只有一种类型,它会降低定义模式的目的。