Java 8 равенство UTC и время Зулу?

Насколько я мог исследовать, 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 Форматы даты и времени:

Время выражается в UTC (скоординированное универсальное время) со специальным обозначением UTC ( "Z" ).

Ответы

Ответ 1

В соответствии с исходным кодом ZonedDateTime.equals использует ZoneId.equals для сравнения компонента идентификатора зоны и, в свою очередь, сравнивает идентификаторы, а не смещения.

Если вы хотите, чтобы два 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.)