找到声称可以解析 ISO8601 中的时间或日期和时间的库很简单。它们似乎都意味着可以将它们配置为解析 ISO8601 的一种格式,例如通过手动滚动合适的字符串格式代码。
但事实上 ISO8601 定义了多种可能的格式来表示日期和时间。例如,给出一个非常简短的变体列表:
- 各种分隔符是可选的或允许使用不同的字符(例如,您可以在日期和时间部分之间使用空格或“T”,并且可以省略日期部分之间的连字符)
- 您可以以不同的精度表示时刻,因此我相信“2018”是一个有效的 ISO8601 字符串
- 您可以通过月份中的某一天、一年中的某一天或周数来指定时间
- 您可以通过多种方式指定时区偏移量(例如“+01:00”、“+0100”或“+01”)
- 等等..
你几乎可以说,ISO8601 定义了一个完整的 DSL 来表示日期和时间。如果您只知道字符串是 ISO8601 格式的时间,那么您了解的并不多。
所以我想知道的是:你能读取一个字符串,只知道它是用某种 ISO8601 格式编码的,并可靠地推断出它是哪种格式使用?或者不幸的是,ISO8601 格式的定义方式是解析器需要提前知道正在使用哪种格式?
最佳答案
这是一个有趣的问题,但答案总是否。 解析一个字符串不仅仅是评估其字符,而是以特定的意图评估它们。
换句话说,你会把它解析成什么?如果一个字符串可能包含日期,可能包含时间,可能包含相对 UTC 的偏移量,或者可能包含基于一年中一周的值,或者可能包含一段耗时,并且可能包含一系列这样的周期,可能在一端有一个固定点...这样一个可以解析所有周期的结果对象不会很有用。人们必须测试该对象的许多可选属性才能知道如何使用它。也许人们可以使用这样的对象来验证字符串是否采用几种有效格式之一,但正则表达式更适合该任务。
值得一提的是,那些试图用单一日期时间类型来统治它们的语言通常都会后悔。考虑陷入这个陷阱的java.util.Date
。 Java 开发人员现在应该知道他们应该使用 java.time 或 Joda-Time 来代替。还要考虑 XSD 等模式语言,它定义了多种日期和时间类型,其中许多与 ISO8601 兼容。如果只有一种类型,就会贬低定义模式的目的。
关于date - 可以检测 ISO8601 字符串中的日期和时间格式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48914362/