2015-02-01 2 views
16

Насколько я мог исследовать, UTC и Zulu - то же самое. Однако я столкнулся с трудностями, сравнивая два ZonedDateTimes, которые я получаю из разных источников в своем коде. Следующий код иллюстрирует проблему:Java 8 равенство UTC и Zulu время?

@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:

Времена выражены в формате UTC (Universal Time), с особым UTC целеуказателем ("Z").

ответ

19

Согласно исходному коду, 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.)

+0

Другой вариант заключается в преобразовании каждого ZonedDateTime в одно мгновение, как два Мгновения будут равны. – VGR

+0

Да ... если это то, чего вы пытаетесь достичь. –

Смежные вопросы