据我所知,UTC和祖鲁语是一样的。但是,我在比较代码中从不同来源收到的两个 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 日期和时间格式:
时间以 UTC(协调世界时)表示,并带有特殊的 UTC 指示符 ("Z")。
比较区域 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。