Переход на летнее время из ZonedDateTime не работает должным образом

У меня есть следующая функция

public String getDateAndTimeInUserFormat(String value, DateTimeFormat inputFormat) {
    return ZonedDateTime.parse(value, DateTimeFormatter.ofPattern(inputFormat.getFormat()))
            .withZoneSameInstant(ZoneId.of(user().getTimezone()))
            .format(DateTimeFormatter.ofPattern(user().getDateFormat() + " " + user().getTimeFormat()));
}

и следующий тест

@Test
public void getDateAndTimeInUserFormat() throws Exception {
    I18NService service = prepareForUserFormatCheck("####.000", "Brazil/Acre");
    assertEquals(service.getDateAndTimeInUserFormat("2017-05-06T20:52:52+0200"),"06-05-2017 13:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-12-06T20:52:52+0200"),"06-12-2017 13:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-01-06T20:52:52+0200"),"06-01-2017 13:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-03-06T20:52:52+0200"),"06-03-2017 13:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-07-06T20:52:52+0200"),"06-07-2017 13:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-09-06T20:52:52+0200"),"06-09-2017 13:52");
}

Тест проходит, но не должен. Из моего понимания я должен был получить некоторые результаты с разницей в один час. Почему у меня одинаковое время для всех этих тестов?

2 ответа

Кажется, что проблема была в часовом поясе. Переход на летнее время не распространяется на Бразилию / Акр. Вот еще один тест, который доказывает, что он работает нормально.

  @Test
  public void getDateAndTimeInUserFormat() throws Exception {
    I18NService service = prepareForUserFormatCheck("####.000", "Brazil/East");
    assertEquals(service.getDateAndTimeInUserFormat("2017-01-06T20:52:52+0200"),"06-01-2017 16:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-02-06T20:52:52+0200"),"06-02-2017 16:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-03-06T20:52:52+0200"),"06-03-2017 15:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-04-06T20:52:52+0200"),"06-04-2017 15:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-05-06T20:52:52+0200"),"06-05-2017 15:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-06-06T20:52:52+0200"),"06-06-2017 15:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-07-06T20:52:52+0200"),"06-07-2017 15:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-08-06T20:52:52+0200"),"06-08-2017 15:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-09-06T20:52:52+0200"),"06-09-2017 15:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-10-06T20:52:52+0200"),"06-10-2017 15:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-11-06T20:52:52+0200"),"06-11-2017 16:52");
    assertEquals(service.getDateAndTimeInUserFormat("2017-12-06T20:52:52+0200"),"06-12-2017 16:52");
  }

Один простой способ проверить даты перехода на летнее время - это получить ZoneRules объект из ZoneId:

ZoneRules rules = ZoneId.of("Brazil/East").getRules();

Затем вы можете проверить список, возвращенный rules.getTransitions(), чтобы увидеть все даты, когда произошли эти изменения, а также смещение до и после изменения.

В некоторых зонах нет списка переходов, но вместо этого есть правила перехода, которые можно проверить с помощью rules.getTransitionRules(),

Другие вопросы по тегам