问题 Java 8 Date and Time API - 解析yyyy-MM-dd'T'HH:mm:ss.SSSZ


我正在尝试以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

顺便说一句:我知道我可以定义自己的格式化程序,而不是问题。只是想确保我不会错过任何东西 ISODateTimeFormat 的 乔达 能够解析两者:

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

10337
2018-04-29 08:26


起源

您可以设置自己的DateFormatter - Murat Karagöz
文档不清楚Z和ZZ之间的区别 - 您是否可以提供一些您尝试解析的示例文本,该文本不会使用ISO_OFFSET_DATE_TIME进行解析? (看起来它比ZZ更像ZZZZZ,因为它包含一个冒号。) - Jon Skeet
原来定义一个可以解析两者的java.time格式化程序并不简单。 - bowmore


答案:


你是正确的,因为这似乎与任何默认格式都不匹配,所以你需要用a来构建你的格式 java.time.format.DateTimeFormatterBuilder


4
2018-04-29 08:31



我很伤心,我知道我可以定义自己的格式,能够解析yyyy-MM-dd'T'HH:mm:ss.SSSZ这不是问题。我想要一种能够解析“Z”和“ZZ”的格式,理想情况下是java.time.format中提供的默认格式。*某处 - vehovmar


我不确定这是你预期的答案。

方法1

使用Instant解析

Instant.parse("2015-06-28T10:13:14.743Z");

方法2

给定的输入格式等同于ISO_DATE_TIME格式 从给定模式中删除'Z'后yyyy-MM-dd'T'HH:mm:ss.SSSZ

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

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

4
2018-06-28 13:20





Joda将ISO8601格式用于默认的ISODateTimeFormat。所以基于该文件 http://www.w3.org/TR/NOTE-datetime,Joda无法解析您的格式。


1
2018-04-29 08:47



你可以自己尝试Joda能够解析它。 - vehovmar
看看我的回答,当然Joda / java.util.time可以创建一个能够解析给定格式的DateTimeFormatter。 - llogiq
谢谢你让我知道 - Khôi Hoàng Nguyễn