ZoneId和LocalDateTime

时间:2017-05-16 10:44:34

标签: java java-8 java-time java-date

我现在正在巴黎运行这段代码,其中12:40,其中ECT = ECT - 欧洲/巴黎

LocalDateTime creationDateTime = LocalDateTime.now(Clock.systemUTC());      
ZoneId zone = ZoneId.of(ZoneId.SHORT_IDS.get("ECT"));


System.out.println ("creationDateTime --------------------------> " + creationDateTime);        
System.out.println ("creationDateTime.atZone(zone).getHour() ---> " + creationDateTime.atZone(zone).getHour());
System.out.println ("creationDateTime.atZone(zone).getMinute() -> " + creationDateTime.atZone(zone).getMinute());

但我在控制台上得到这个

creationDateTime --------------------------> 2017-05-16T10:40:07.882
creationDateTime.atZone(zone).getHour() ---> 10
creationDateTime.atZone(zone).getMinute() -> 40

我不应该得到12:40 ???????

2 个答案:

答案 0 :(得分:7)

不,你不应该。您已经要求ZonedDateTime与您开始使用的LocalDateTime相同,但与特定时区相关联。

来自LocalDateTime.atZone的文档:

  

这将返回在指定时区的此日期时间形成的ZonedDateTime。结果将尽可能与此日期时间匹配。时区规则(例如夏令时)意味着并非每个本地日期时间对指定区域都有效,因此可以调整本地日期时间。

在这种情况下,不需要调整,因为2017-05-16T10:40:07.882 在巴黎发生

听起来你的错误就是创建一个LocalDateTime。您基本上已经说过"了解UTC当前时间,然后采用相同的本地日期和时间,但假装它在不同的时区。 "

如果您的目标是获取zone的当前时间,则根本不应该有LocalDateTime。只需使用:

ZonedDateTime zonedNow = ZonedDateTime.now(Clock.system(zone));

或(等效地)

ZonedDateTime zonedNow = Clock.systemUTC().instant().atZone(zone);

答案 1 :(得分:0)

此方法返回ZonedDateTime,而不是修改后的LocalDateTime。因此,在这种情况下,它将在时区ETC中返回代表2017-05-16 10:40的ZonedDateTime