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.)