2016-10-12 2 views
4

В Java 8-временном API вы можете создать LocalDateTime, которое приходится на перекрытие времени во время изменения времени DST осенью (Центральноевропейское время).Как Java 8 time api выбирает смещение на период изменения DST

Вы можете преобразовать это в ZonedDateTime, которое представляет собой точный момент времени с помощью ZoneId.

Выполнение этого на самом деле не разрешает двусмысленность - все равно могут быть два момента времени, которые соответствуют этому LocalDateTime и этой зоне (но при разных смещениях).

Как и почему (справочный прием) API времени выбирает летнее смещение?

@Test 
public void TimeSetOnDST() throws Exception { 
    LocalDateTime time = LocalDateTime.of(2016, 10, 30, 2, 30); // in the DST time overlap 
    ZonedDateTime of = ZonedDateTime.of(time, ZoneId.of("Europe/Zurich")); 
    System.out.println(of); // 2016-10-30T02:30+02:00[Europe/Zurich] 
    // But why not 2016-10-30T02:30+01:00[Europe/Zurich] ? 
    // Is this just "by convention"? 
} 

ответ

3

Это хорошо документированы в javadoc:

В большинстве случаев, есть только один действительный сдвиг для локального даты-времени. В случае перекрытия, когда часы установлены назад, существуют два допустимых смещения. Этот метод использует более раннее смещение, обычно соответствующее «лету».

Как описано в комментариях @JodaStephen, если вы хотите выбрать другое доступное смещение, вы можете использовать the withLaterOffsetAtOverlap method.

+0

Спасибо. Тогда я согласен. – Philipp

+3

Просто используйте ['withLaterOffsetAtOverlap()'] (http://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap--), если вы хотите изменить соглашение. (Соглашение было выбрано так, как это лучше, чем исключение или дополнительный параметр для большинства случаев использования.) – JodaStephen

+0

Я чувствую, что соглашение выбрано разумно. «Документ LocalDateTime» говорит, что это «настенные часы», и соглашение следует тому, что мы все предполагаем, когда мы просыпаемся утром после смены DST :) –

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

  • Нет связанных вопросов^_^