解析所有 ISO 8601 日期时间格式 Java 1.8

Parse all ISO 8601 DateTime formats Java 1.8

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

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

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

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

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            .appendPattern("XX")
            .toFormatter();

    String[] stringsPassed = {
            "2018-11-01T16:26:15+0100",
            "2018-10-31T08:27:00.0000000Z"
    };
    
    for (String sample : stringsPassed) {
        OffsetDateTime odt = OffsetDateTime.parse(sample, formatter);
        System.out.println(odt);
    }

输出:

2018-11-01T16:26:15+01:00
2018-10-31T08:27Z

它不会解析所有可以想到的 ISO 8601 字符串,但可以解析您可以获得的字符串。你只给我们看了两个样品,我不知道。

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

Joda-Time? 不推荐使用 Java 8. 引用 Joda-Time 主页的几句话:

Joda-Time is the de facto standard date and time library for Java prior to Java SE 8. Users are now asked to migrate to java.time (JSR-310).

Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to java.time (JSR-310).

即使在 Java 6 和 7 上,我也会推荐在 Joda-Time 上向后移植 java.time。

链接