Java 8日期和时间API - 解析yyyy-MM-dd'T'HH:mm:ss.SSSZ

18

我正在尝试解析 ISO8601 格式的日期:

yyyy-MM-dd'T'HH:mm:ss.SSSZ

请问使用 java.time.format.DateTimeFormatter 中定义的任何默认格式无法解析它,这样理解是否正确?

例如 ISO_OFFSET_DATE_TIME 只能解析如下格式:

yyyy-MM-dd'T'HH:mm:ss.SSSZZ

样例:

yyyy-MM-dd'T'HH:mm:ss.SSSZ
2015-04-29T10:15:00.500+0000

yyyy-MM-dd'T'HH:mm:ss.SSSZZ
2015-04-29T10:15:00.500+00:00

顺便提一句:我知道我可以定义自己的格式化程序,这不是问题。只是想确保我没有错过什么,因为JodaISODateTimeFormat能够解析两者:

 org.joda.time.format.DateTimeFormatter dateTimeFormatter = ISODateTimeFormat.dateTime();
 DateTime dateTime = dateTimeFormatter.parseDateTime("2015-04-29T10:15:00.500+0000");

您可以设置自己的日期格式化程序。 - Murat Karagöz
文档并没有很清楚地说明Z和ZZ之间的区别 - 可以给一些示例文本来解析,这些文本不能使用ISO_OFFSET_DATE_TIME解析吗?(看起来更像是ZZZZZ而不是ZZ,因为它包括一个冒号。) - Jon Skeet
2
事实证明,定义一个可以解析两者的java.time格式化程序并不简单。 - bowmore
4个回答

6
我不确定这是否是您期望的答案。
方法1:
使用Instant进行解析。
Instant.parse("2015-06-28T10:13:14.743Z");

方法二

给定的输入格式相当于在从给定模式yyyy-MM-dd'T'HH:mm:ss.SSSZ中去除'Z'后的ISO_DATE_TIME格式。

然后我们可以使用ISO_DATE_TIME解析它。

 text = "2015-06-28T10:13:14.743"
 LocalDateTime.parse(text,DateTimeFormatter.ISO_DATE_TIME)

6

你再也不用被那些烦人的日期格式所困扰了。

现在有一个新的库dateparser

它可以自动识别任何字符串,并将其正确解析为日期日历本地日期时间偏移日期时间等。

使用它,你就不需要准备任何适当的模式,如yyyy-MM-dd'T'HH:mm:ss.SSSZyyyy-MM-dd'T'HH:mm:ss.SSSZZ

Date date = DateParserUtils.parseDate("2015-04-29T10:15:00.500+0000");
Calendar calendar = DateParserUtils.parseCalendar("2015-04-29T10:15:00.500Z");
LocalDateTime dateTime = DateParserUtils.parseDateTime("2015-04-29 10:15:00.500 +00:00");

一切都很好,尽情享用吧。


那个库经过了很多努力,最终运行得非常好。 - ppdmartell

4

您说得对,这似乎不符合任何默认格式,因此您需要使用 java.time.format.DateTimeFormatterBuilder 构建您的格式。


就像我之前所说的,我知道我可以定义自己的格式来解析yyyy-MM-dd'T'HH:mm:ss.SSSZ,这不是问题所在。我想要一个能够解析"Z"和"ZZ"的格式,最好是在java.time.format.*中提供的默认格式。 - vehovmar

1

1
你可以自己尝试,Joda能够解析它。 - vehovmar
当然可以使用Joda / java.util.time创建DateTimeFormatter以解析给定的格式。请查看我的答案。 - llogiq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接