解析所有 ISO 8601 DateTime 格式 Java 1.8

Ani*_*ban 2 java datetime iso8601 datetime-parsing java-8

我在我的项目中使用 spring boot 和 Java 1.8。我们从外部系统接收到一个需要解析的日期字符串。问题是外部系统可以发送任何符合 ISO 8601 的 DateTime,我们需要解析任何出现的 ISO 8601 格式字符串。谁能建议我该怎么做?有没有库可以做到这一点?

传递的两种日期时间格式是 2018-11-01T16:26:15+0100、2018-10-31T08:27:00.0000000Z,还可以有更多。

我在 StackOverflow 上发现了一些建议使用 Joda Time 转换器的帖子,但我无法用它解析日期 2018-10-31T08:27:00.0000000Z。

Ole*_*.V. 5

这可能会为您解决问题,或者至少是一个开始:

\n
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()\n            .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)\n            .appendPattern("XX")\n            .toFormatter();\n\n    String[] stringsPassed = {\n            "2018-11-01T16:26:15+0100",\n            "2018-10-31T08:27:00.0000000Z"\n    };\n    \n    for (String sample : stringsPassed) {\n        OffsetDateTime odt = OffsetDateTime.parse(sample, formatter);\n        System.out.println(odt);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
\n
2018-11-01T16:26:15+01:00\n2018-10-31T08:27Z\n
Run Code Online (Sandbox Code Playgroud)\n
\n

它不会解析所有可以想到的 ISO 8601 字符串,但可以解析您可以获得的字符串。由于你只向我们展示了两个样品,我无法知道。

\n

java.time 是现代 Java 日期和时间 API,对 ISO 8601 非常友好。它处理是否存在秒以及秒的小数部分(最多 9 位小数)。这就是我DateTimeFormatter.ISO_LOCAL_DATE_TIME在代码中使用的。一个小问题是内置的DateTimeFormatter.ISO_OFFSET_DATE_TIME,否则看起来就在这里,需要 UTC 偏移量中的冒号,如 中所示+01:00。相反,我使用格式模式XX。它接受不带冒号的偏移量,并且也接受Z第二个示例中的偏移量。如果还需要更多灵活性,您可以查看格式化程序中的可选部分。检查文档。

\n

乔达时间?当您使用 Java 8 时,不建议使用。Joda-Time 主页上的几句话:

\n
\n

Joda-Time 是Java SE 8 之前的 Java事实上的标准日期和时间库。现在要求用户迁移到java.time\n(JSR-310)。

\n

请注意,Joda-Time 被认为是一个很大程度上 \xe2\x80\x9cfinished\xe2\x80\x9d 项目。\n没有计划进行重大增强。如果使用 Java SE 8,请迁移\n到java.time(JSR-310)。

\n
\n

即使在 Java 6 和 7 上,我也会建议向后移植 java.time 而不是 Joda-Time。

\n

链接

\n\n