【发布时间】: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