解析所有 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。
链接
- Oracle tutorial: Date Time 解释如何使用
java.time
.
DateTimeFormatter
and DateTimeFormatterBuilder
的文档。
- Joda-Time home page
我在我的项目中使用 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。
链接
- Oracle tutorial: Date Time 解释如何使用
java.time
. DateTimeFormatter
andDateTimeFormatterBuilder
的文档。- Joda-Time home page