date - 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
解决方案
一旦您将日期字符串解析为LocalDateTime
区域偏移量,就会丢失,因为LocalDateTime
不包含任何时区或偏移量信息。当您再次将其格式化LocalDateTime
为字符串时,您将只有在没有偏移的情况下解析它的时间。
的文档LocalDateTime
清楚地解释了这一点:
此类不存储或表示时区。相反,它是对日期的描述,用于生日,结合挂钟上的当地时间。如果没有诸如偏移或时区之类的附加信息,它就不能代表时间线上的瞬间。
您应该考虑使用OffsetDateTime
or ZonedDateTime
。
推荐阅读
- asp.net - AspNet Core Angular *NgFor 不显示数据
- vb.net - 应用程序需要一段时间来侦听传入连接
- android - map is overlapping on the drawer in flutter. how to fix this?
- php - second module not working in HMVC in Codeigniter
- typescript - 具有多个字符串值的打字稿枚举
- javascript - 如何将毫秒转换为当前日期?
- javascript - 使用 JQuery 更改单选按钮检查状态
- c# - wpf how to binding one TreeView to another TreeView
- php - PHP AES 128 bit encryption/decryption
- firebase - React Native Firebase 身份验证功能