Java 8 如何将UTC中标准ISO 8601格式的输入字符串解析为Java?

Java 8 如何将UTC中标准ISO 8601格式的输入字符串解析为Java?,java-8,Java 8,下面的java代码引发了一个异常 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); simpleDateFormat.parse("2019-09-10T07:06:26.287Z") java.text.ParseException: Unparseable date: "2019-09-10T07:06:26.287Z" at java.text.Da

下面的java代码引发了一个异常

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

simpleDateFormat.parse("2019-09-10T07:06:26.287Z") 


java.text.ParseException: Unparseable date: "2019-09-10T07:06:26.287Z"
    at java.text.DateFormat.parse(DateFormat.java:366)
知道如何解决这个问题吗

tl;博士 java.time 现代的解决方案使用内置于Java8和更高版本中的类,并带有

您使用的是与最早版本的Java捆绑在一起的糟糕的前置类。
SimpleDataFormat
类及其同级是有缺陷的,是由不了解日期-时间处理的人开发的。完全避免这些课程

ISO 8601 您的输入字符串表示使用标准格式的时刻。末尾的
Z
是UTC的缩写,发音为“Zulu”

在解析/生成字符串时,java.time类默认使用标准ISO 8601格式。因此,无需指定格式化模式

在UTC中,请使用该类

要通过特定地区的人们使用的挂钟时间查看同一时刻,请应用
ZoneId
(时区)以获取
zoneDateTime
对象

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
看这个

instant.toString():2019-09-10T07:06:26.287Z

zdt.toString():2019-09-10T03:06:26.287-04:00[美国/蒙特利尔]

相同的时刻,时间线上相同的同时点,不同的挂钟时间。

您也可以尝试

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

使用它,您不必准备任何合适的模式,如
yyy-MM-dd'HH:MM:ss.SSSZ

Date-Date=DateParserUtils.parseDate(“2019-09-10T07:06:26.287Z”);
日历=DateParserUtils.parseCalendar(“2019-09-10T07:06:26.287Z”);
LocalDateTime dateTime=DateParserUtils.parseDateTime(“2019-09-10T07:06:26.287Z”);

请欣赏。

对其他人说:我知道这个问题是重复的。但当我试图找到一个接近原始,我发现这是令人惊讶的困难。因此,也许这个问题可以成为未来不可避免的重复的原始问题。为了便于查找,我更改了标题。
LocalDateTime
是该输入字符串的错误类。您正在丢弃有价值的偏移量信息。
2019-09-10T07:06:26.287Z
具有偏移量
+00:00
,可以将其解析为
OffsetDateTime
,但
OffsetDateTime
可以转换为
LocalDateTime
,这是正确的。例如,如果您的本地区域是
+02:00
2019-09-10T07:06:26.287Z
可以解析为
2019-09-10 09:06:26.287
Instant instant = Instant.parse( "2019-09-10T07:06:26.287Z" ) ;
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;