【问题标题】:Java 8 equality of UTC and Zulu time?UTC和祖鲁时间的Java 8相等?
【发布时间】:2015-02-01 13:33:00
【问题描述】:

据我研究,UTC 和 Zulu 是相同的。但是,在比较从代码中不同来源收到的两个 ZonedDateTimes 时,我遇到了困难。 下面的代码说明了这个问题:

@Test
public void equalsOnTimezone() throws Exception {
    ZonedDateTime zdtUtc = ZonedDateTime.of(2015, 2, 1, 14, 30, 0, 0, ZoneId.of("UTC"));
    ZonedDateTime zdtZ = ZonedDateTime.of(2015, 2, 1, 14, 30, 0, 0, ZoneId.of("Z"));
    assertEquals(zdtUtc, zdtZ); // will fail
}

问题:

java.lang.AssertionError: expected:<2015-02-01T14:30Z[UTC]> but was:<2015-02-01T14:30Z>

那么创建和比较基于 UTC 的值的正确方法是什么?

根据 W3C Date and Time Formats:

时间以 UTC(协调世界时)表示,带有一个特殊的 UTC 指示符(“Z”)。

【问题讨论】:

    标签: java datetime timezone java-8


    【解决方案1】:

    比较区域 ID 而不是偏移量

    根据源代码,ZonedDateTime::equals 使用ZoneId::equals 来比较 zone id 组件,然后比较 ids 而不是偏移量。

    如果您希望两个具有“不同但等效”区域 id 的 ZonedDateTime 比较相等,您应该像这样创建它们,调用 ZoneId::normalized

    ZonedDateTime zdtUtc = ZonedDateTime.of(
        2015, 2, 1, 14, 30, 0, 0, ZoneId.of("UTC").normalized());
    ZonedDateTime zdtZ = ZonedDateTime.of(
        2015, 2, 1, 14, 30, 0, 0, ZoneId.of("Z").normalized());
    

    我认为这是您的期望(基于字符串表示的 W3C 文档)不符合 Java 类的文档化语义的情况。在这种情况下,Javadoc 是权威的。

    (这不是 Java 8 错误,IMO。)

    【讨论】:

    • 另一种选择是将每个 ZonedDateTime 转换为 Instant,因为这两个 Instant 将相等。
    • 是的......如果这是你想要达到的目标。
    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2010-11-18
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2013-11-08
    相关资源
    最近更新 更多