Java 8与UTC和Zulu时间相等吗?

时间:2015-02-01 13:33:00

标签: java datetime timezone java-8

到目前为止我可以研究,UTC和Zulu是一样的。但是,我在比较我在代码中从不同来源收到的两个ZonedDateTime时遇到了困难。 以下代码说明了问题:

@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”)。

1 个答案:

答案 0 :(得分:20)

根据源代码,ZonedDateTime.equals使用ZoneId.equals来比较区域ID组件,然后比较ID而不是偏移量。

如果你想让两个带有“不同但等效”的区域ID的ZonedDateTime比较相等,你应该像这样创建它们:

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。)