Java 8时间API在夏令时更改期间如何选择偏移量

5
在Java 8时间API中,您可以创建一个LocalDateTime,该时间落在秋季(中欧时间)夏令时变化期间的重叠时间内。
您可以使用ZoneId将其转换为表示精确时间的ZonedDateTime。
这样做实际上并没有解决歧义 - 在这个LocalDateTime和这个Zone(但具有不同的偏移量)仍然可能存在两个时间点。
时间API如何选择夏季偏移量以及原因(欢迎参考)?
@Test
public void TimeSetOnDST() throws Exception {
    LocalDateTime time = LocalDateTime.of(2016, 10, 30, 2, 30); // in the DST time overlap
    ZonedDateTime of = ZonedDateTime.of(time, ZoneId.of("Europe/Zurich"));
    System.out.println(of); // 2016-10-30T02:30+02:00[Europe/Zurich]
    // But why not 2016-10-30T02:30+01:00[Europe/Zurich] ?
    // Is this just "by convention"?
}
1个回答

4

javadoc中有详细说明:

在大多数情况下,本地日期时间只有一个有效偏移量。在重叠的情况下,即时钟被倒退时,有两个有效的偏移量。此方法使用通常对应于“夏季”的较早偏移量。

如@JodaStephen所述,在评论中,如果您想选择其他可用的偏移量,则可以使用withLaterOffsetAtOverlap方法


谢谢。我猜这只是惯例。 - Philipp
3
如果你想改变惯例,请使用 [withLaterOffsetAtOverlap()] (http://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap--)。(选择惯例是因为对于大多数用例来说,它比异常或其他参数更好。) - JodaStephen
我觉得这个约定选择得很明智。LocalDateTime文档说它是一个“挂钟”,而这个约定遵循了我们在夏令时转换后第二天早上所假设的情况 :) - Pavel Zdenek
我也很欣赏对已经过度设计的时间/日期支持进行持续重构。至少与其他语言的SDK相比,它们通常只是包装POSIX时间API而感到满足。 - Pavel Zdenek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接