解析所有ISO 8601 DateTime格式的Java 1.8

时间:2018-11-05 13:09:16

标签: java datetime java-8 iso8601 datetime-parsing

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

传递的两种DateTime格式是2018-11-01T16:26:15 + 0100,2018-10-31T08:27:00.0000000Z并且可以有更多种。

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

1 个答案:

答案 0 :(得分:3)

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

    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可能会出现在此处,但在+01:00中,UTC偏移量需要一个冒号。相反,我使用的是格式模式XX。如第二个示例所示,它接受不带冒号的偏移量,还接受Z。如果还需要更大的灵活性,则可以查看格式化程序中的可选部分。检查文档。

Joda-Time吗??当您使用Java 8时,不建议使用。

  

Joda-Time是Java的 de facto 标准日期和时间库   Java SE 8之前的版本。现在要求用户迁移到java.time   (JSR-310)。

     

请注意,Joda-Time被认为是很大程度上“完成”的项目。   没有计划进行重大增强。如果使用Java SE 8,请迁移   到java.time(JSR-310)。

即使在Java 6和7上,我也会推荐通过Joda-Time进行java.time的反向移植。

链接