【问题标题】:How does Java 8 time api choose the offset on DST change periodJava 8 time api如何选择DST更改周期的偏移量
【发布时间】:2016-10-12 08:07:19
【问题描述】:

在 Java 8 时间 API 中,您可以创建一个 LocalDateTime,它在秋季(中欧时间)的 DST 时间变化期间属于时间重叠。

您可以将其转换为 ZonedDateTime,它使用 ZoneId 表示精确的时间点。

这样做实际上并不能解决歧义 - 仍然可能有两个时刻对应于这个 LocalDateTime 和这个区域(但在不同的偏移量)。

时间 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"?
}

【问题讨论】:

    标签: java java-time


    【解决方案1】:

    javadoc 中有详细记录:

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

    正如@JodaStephen 在 cmets 中所述,如果您想选择其他可用的偏移量,可以使用 the withLaterOffsetAtOverlap method

    【讨论】:

    • 谢谢。我想这只是按照惯例。
    • 如果您想更改约定,只需使用withLaterOffsetAtOverlap()。 (选择约定是因为它比大多数用例的异常或附加参数更好。)
    • 我觉得这个约定是明智的选择。 LocalDateTime doc 说这是一个“挂钟”,约定遵循我们在 DST 轮班后早上醒来时的假设:)
    • 我也很欣赏对已经过度设计的时间/日期支持的持续重新设计。至少与其他语言的 SDK 相比,其他语言的 SDK 通常只需包装 POSIX 时间 API 即可完成。
    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 2011-04-11
    • 2012-06-19
    • 1970-01-01
    • 2019-04-11
    • 2020-06-27
    • 2016-11-22
    相关资源
    最近更新 更多