Java 8 UTC和祖鲁时间的平等?比较区域 ID 而不是偏移

2022-09-02 04:24:23

据我所知,UTC和祖鲁语是一样的。但是,我在比较代码中从不同来源收到的两个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 日期和时间格式

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


答案 1

比较区域 ID 而不是偏移

根据源代码,ZonedDateTime::equals使用ZoneId::equals来比较区域ID组件,这反过来又比较id而不是偏移量。

如果您希望两个具有“不同但等效”区域 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。


答案 2