当前位置: 首页 > 知识库问答 >
问题:

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

澹台正真
2023-03-14

我在我的项目中使用 Spring boot 和 Java 1.8。我们正在从外部系统接收一个需要解析的日期字符串。问题是外部系统可以发送任何符合ISO 8601的日期时间,我们需要解析任何ISO 8601格式的字符串。谁能建议我怎么做?有没有用于执行此操作的库?

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

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

共有1个答案

羊舌光赫
2023-03-14

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

    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位小数)。这就是我使用的<code>DateTimeFormatter。代码中的ISO_LOCAL_DATE_TIME。轻微的问题是内置的<code>DateTimeFormatter。ISO_OFFSET_DATE_TIME,否则在这里看起来很正确,它需要UTC偏移量中的冒号,如01:00所示。相反,我使用的是格式模式XX。它接受一个不带冒号的偏移量,也接受Z,如第二个示例所示。如果还需要更多的灵活性,您可以查看格式化程序中的可选部分。检查文档。

Joda-Time?不推荐使用Java8。来自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的后端口。时间超过乔达时间。

  • Oracle教程:日期时间解释如何使用java.time
  • DateTimeFor的文档DateTimeFormatterBuilder
  • Joda-Time主页
 类似资料:
  • 因此,有一个关于web应用程序的部分,用户可以向其中输入事件,web服务将这些事件以以下格式发送到移动应用程序: 我在尝试将字符串转换为日期时遇到了问题,这样我就可以从事件中获得时间(也可以在正确的时区中格式化),例如,这里有一个出现在“2015-03-20T20:00:00-07:00”上的字符串,当我拉动时,时间应该是太平洋时间1PM。但我得到的不是8PM就是3AM(这取决于我是否将UTC缩写

  • 问题内容: 我正在使用bootstrap-datetimepicker和ISO8601 datetime格式,如其选项部分所述 在我的控制器中 它以(console.log)将数据发送到后端 并保存为数据库 在我的模板中 我在HTML上看到的输出为 但是根据Angular doc,它应该用于格式 我想念的是什么? 问题答案: 现在,我已经创建了一个过滤器 作为依赖项添加为 并用作 并将日期显示为

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 下表显示可用于为图表中的日期时间字段创建用户定义的数据格式的说明符。 说明符 描述 D 将日显示为不带前导零的数字(1-31)。 DD 将日显示为带前导零的数字(01-31)。 M 将月份显示为不带前导零的数字(1-12)。 MM 将月份显示为带前导零的数字(01-12)。 MMM 将月份显示为缩写形式(Jan-Dec)。 MMMM 将月份显示为完整月份名(January-December)。 Y

  • 我想以yyyy-mm-dd格式存储今天的日期。在存储之前,我将今天的日期格式化,并再次解析格式化后的字符串。它以不同于我想要的格式给出了输出日期。我如何获得日期,将其格式化为' yyyy-mm-dd '并再次将其转换为日期,并希望输出格式为' yyyy-mm-dd '。请找到下面的代码,告诉我哪里错了 我得到的上述代码的输出是星期四 Mar 07 00:00:00 GMT 2013.但我希望输出为