为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2021-12-30 20:07:58
我在我的项目中使用 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 时间转换器的帖子,但我无法用它解析日期 2018-10-31T08:27:00.0000000Z。
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

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


    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你的第二个例子。如果还需要更多的灵活性,您可以查看格式化程序中的可选部分。检查文档。


乔达时间?使用 Java 8 时不推荐使用。 Joda-Time 主页上的一些引用:


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


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


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


查看完整回答
反对 回复 2021-12-30
  • 1 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信