Java 8 如何将UTC中标准ISO 8601格式的输入字符串解析为Java?
下面的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
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 ) ;