我现在正在巴黎运行这段代码,其中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 ???????
答案 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
。