Java 8 UTC 和祖鲁时间是否相等?

Java 8 equality of UTC and Zulu time?

据我所知,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:

Times are expressed in UTC (Coordinated Universal Time), with a special UTC designator ("Z").

比较区域 ID 而不是偏移量

根据源代码,ZonedDateTime::equals uses ZoneId::equals比较区域 id 组件,然后比较 ids 而不是偏移量。

如果你想要两个ZonedDateTime with "different but equivalent" zone ids to compare as equal, you should create them like this, calling 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 类 的文档语义不符的情况。在这种情况下,Java文档是确定的。

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