【问题标题】:java 8 instant with time 00:00:00 gives time 02:00:00 after conversion to util,Datejava 8 Instant with time 00:00:00 在转换为 util,Date 后给出时间 02:00:00
【发布时间】:2017-09-14 16:38:15
【问题描述】:

我在将 java.time.Instant 转换为 java.util.Date 时遇到问题:

System.out.println(item.getStart()); // getStart returns instant
System.out.println(Date.from(item.getStart()));

给出输出:

2017-08-29T00:00:00Z
Tue Aug 29 02:00:00 CEST 2017

为什么日期时间是 02:00:00?以及如何使用时间 00:00:00 进行转换

【问题讨论】:

  • 两者对应同一个瞬间。但Instant 以 UTC 打印,Date 以 JVM 默认时区打印。您不会转换 Date 对象,因为 it has no format。但是,如果您想转换为String,请查看stackoverflow.com/q/4216745/7605325
  • 您观察到的是预期的正确行为。您的Date 保持相同的时间点。 System.out.println() 隐式调用 Date.toString(),后者又将时间转换为中欧时区的字符串,产生您看到的输出。
  • “以及如何在时间 00:00:00 进行转换?”你已经得到了一个Date,时间为 00:00:00 UTC。不要被toString() 的输出所欺骗。
  • 作为 Ole V.V.评论说,Date::toString 是谎言。该方法应用 JVM 当前的默认时区,这意味着该时区被分配给 Date 对象,而实际上 Date 始终是 UTC。避免这个可怕的旧课程的众多原因之一。只使用 java.time 类。
  • 正如 Hugo 评论的那样,UTC 午夜 与中欧凌晨 2 点相同。如果有人在冰岛雷克雅未克观看午夜钟声敲响,在法国巴黎通过电话对他们的朋友说:“哇,看看时间”,巴黎人会回复“Mais oui, 2 AM”。

标签: java date time java.time.instant


【解决方案1】:

2017-08-29T00:00:00Z 中,Z 表示Zulu,即UTC+0。 所以它描述的时间点与Tue Aug 29 02:00:00 CEST 2017 完全相同,即UTC+2

它被打印为 CEST,因为 toString() 方法的默认实现使用默认时区。

您可以尝试改用 Java8 LocalDate。它没有任何时间信息。

如何进行转换,您可以在此处查看:https://stackoverflow.com/a/35187046/1199731

【讨论】:

  • 这对你有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2015-08-28
  • 2011-06-27
相关资源
最近更新 更多