首页 > 解决方案 > Java 8 LocalDateTime 有不同的结果

问题描述

我正在尝试更新一些代码以使用 Java 8 的功能来解析多种日期格式。我盒子上的当地时间设置为UTC-11

以下代码在使用 SimpleDateformat 时有效。

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
Date correctDate = dateFormat.parse("2018-09-6T03:28:59.039-04:00");

//Gives me correct date  
System.println( correctDate);//Wed Sep 5th 20:28:59 GMT-11:00 2018

我正在尝试使用 Java 8 中的 DateTimeFormatter 更新此代码以提供与上述相同的日期,因此我可以处理另一种日期格式..

DateTimeFormattter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS]XXX");
LocalDateTime updateDate = LocalDateTime.parse( "2018-09-6T03:28:59.039-04:00", dtf);

//shows the wrong date of 2018-09-06 03:28:59.039.
System.out.println( updateDate.toString() );// 2018-09-06 03:28:59.039

[已解决] 我可以通过使用 ZonedDateTime 来解决这个问题。

ZonedDateTime zdt = ZonedDateTime.parse("2018-09-6T03:28:59.039-04:00");
zonedDateTime = zdt.withZoneSameInstance(ZoneId.of("GMT"));

Date correctDate = Date.from( zonedDateTime.toInstance());

//correctDate 是我想要的 2018 年 9 月 5 日星期三 20:28:59 GMT-11:00

标签: datedatetimejava-8

解决方案


一旦您将日期字符串解析为LocalDateTime区域偏移量,就会丢失,因为LocalDateTime不包含任何时区或偏移量信息。当您再次将其格式化LocalDateTime为字符串时,您将只有在没有偏移的情况下解析它的时间。

文档LocalDateTime清楚地解释了这一点:

此类不存储或表示时区。相反,它是对日期的描述,用于生日,结合挂钟上的当地时间。如果没有诸如偏移或时区之类的附加信息,它就不能代表时间线上的瞬间。

您应该考虑使用OffsetDateTimeor ZonedDateTime


推荐阅读