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