Разница между добавлением Duration.ofDays (1) и Period.ofDays (1) к ZonedDateTime вокруг перехода на летнее время - PullRequest
0 голосов
/ 13 ноября 2018

Переход на летнее время заканчивается 1 ноября в 2 часа ночи в американском / восточном часовом поясе. В результате 2 часа ночи становятся 1 часом утра.

Я не могу понять следующее в приведенном ниже коде:

  1. Почему в строке 2 отображается время 09:00, а не 10:00 (при добавлении 1 дня)?
  2. Почему в строке 4 отображается время 10:00, а не 09:00 (с добавлением 24 часов)?

    LocalDateTime ld = LocalDateTime.of(2015, Month.OCTOBER, 31, 10, 0);
    
    ZonedDateTime date = ZonedDateTime.of(ld, ZoneId.of("US/Eastern"));
    System.out.println(date);       //line 1 - 2015-10-31T10:00-04:00[US/Eastern]
    
    date = date.plus(Duration.ofDays(1));
    System.out.println(date);       //line 2 - 2015-11-01T09:00-05:00[US/Eastern]
    
    date = ZonedDateTime.of(ld, ZoneId.of("US/Eastern"));
    System.out.println(date);       //line 3 - 2015-10-31T10:00-04:00[US/Eastern]
    
    date = date.plus(Period.ofDays(1));
    System.out.println(date);       //line 4 - 2015-11-01T10:00-05:00[US/Eastern]
    

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Продолжительность: Несмотря на то, что метод ofDays Duration не имеет понятия дней.Duration.ofDays(1) немедленно конвертируется в 24 часа, так что это то, что вы добавляете.Поскольку вы добавляете 24 часа к 10:00 дня до окончания летнего времени, вы получите 09:00 следующего дня, как вы заметили,

Период: В отличие от Duration a Period знает дни, недели, месяцы и годы.Таким образом, вы добавляете 1 календарный день, нажимая на то же время настенных часов на следующий день (10:00), даже если это означает, что 25 часов спустя (не 24).

0 голосов
/ 13 ноября 2018

См. Полную документацию по Java по Длительность и Период , всегда один быстрый поиск в Google.

Из Длительности:

Кроме того, устройство DAYS может использоваться и обрабатываться как точно равное 24 часам, таким образом игнорируя эффекты перехода на летнее время.См. Период для основанного на дате эквивалента этому классу.

Начиная с Периода:

Длительность и периоды отличаются в отношении обработки перехода на летнее время при добавлении в ZonedDateTime.Длительность добавит точное количество секунд, таким образом, продолжительность одного дня всегда будет ровно 24 часа.Напротив, Период добавит концептуальный день, пытаясь сохранить местное время

Таким образом, Period будет поддерживать тот же час, тогда как Длительность добавит 24 часа.

24 часа после 10:00 31 октября - 9:00 1 ноября.

  1. 11: 00
  2. 12: 00
  3. 13: 00 (13:00)
  4. 14: 00
  5. 15: 00
  6. 16: 00
  7. 17: 00
  8. 18: 00
  9. 19: 00
  10. 20: 00
  11. 21: 00
  12. 22: 00
  13. 23: 00
  14. 0: 00(полночь)
  15. 1: 00
  16. 1: 00 (вот этот дополнительный час)
  17. 2: 00
  18. 3: 00
  19. 4: 00
  20. 5: 00
  21. 6: 00
  22. 7: 00
  23. 8: 00
  24. 9: 00
...