Java API, чтобы получить начальную и конечную детали перехода на летнее время для определенного часового пояса в течение года - PullRequest
2 голосов
/ 15 октября 2019

Поэтому я использую getAvailableZoneIds() метод в java.time.ZoneId, чтобы получить список доступных часовых поясов.

Я хотел знать, есть ли способпо которому для определенного часового пояса, например, «Америка / Чикаго», я могу узнать начальную и конечную дату и время перехода на летнее время в течение года. Например, когда это начинается и заканчивается. Пошли различные классы, включая ZoneId, ZonedDateTime, ZoneOffset, TimeZone, доступные в java, но не смогли найти какой-либо способ, с помощью которого я могу получить эту информацию. 1012 *

Вывод:

previous Transition of DST ==>  Transition[Overlap at 2019-02-17T00:00-02:00 to -03:00]
next Transition of DST ==>  Transition[Gap at 2019-11-03T00:00-03:00 to -02:00]

Но мне нужно выяснить для конкретного года, во сколько он начинается и во сколько он заканчивается.

1 Ответ

4 голосов
/ 15 октября 2019

Для определенного года вы можете указать ZoneRules год как часть задания момента. В любой момент вы можете задать следующий или предыдущий ZoneOffsetTransition.

Вот пример кода для Europe/Sofia часового пояса.

ZoneId zoneSofia = ZoneId.of( "Europe/Sofia" );
ZoneRules zoneRules = zoneSofia.getRules();

// Pick a moment, arbitrarily.
ZonedDateTime zdt = ZonedDateTime.of( 2019 , 10 , 15 , 10 , 0 , 0 , 0 , zoneSofia );
// Is DST in effect at that moment?
boolean isDst = zoneRules.isDaylightSavings( zdt.toInstant() );

// When are the closest offset transitions, previous (in the past), and next (in the future).
ZoneOffsetTransition previousTransition = zoneRules.previousTransition( zdt.toInstant() );
ZoneOffsetTransition nextTransition = zoneRules.nextTransition( zdt.toInstant() );

// When is the next transition happening in UTC? In Sofia time?
Instant nextTransitionInstant = nextTransition.getInstant();  // An `Instant`` is always in UTC, by definition.
ZonedDateTime nextTransactionZdt = nextTransitionInstant.atZone( zoneSofia ); // Same moment, same point on the timeline, different wall-clock time.
boolean isDstAfterTransition = zoneRules.isDaylightSavings( nextTransactionZdt.toInstant() );

Дамп на консоль.

System.out.println( "zone = " + zoneSofia );
System.out.println( "zdt: " + zdt );
System.out.println( "isDst: " + isDst );
System.out.println( "previousTransition = " + previousTransition );
System.out.println( "nextTransition = " + nextTransition );
System.out.println( "nextTransitionInstant = " + nextTransitionInstant );
System.out.println( "nextTransactionZdt = " + nextTransactionZdt );
System.out.println( "isDstAfterTransition = " + isDstAfterTransition );

zone =Европа / София

zdt: 2019-10-15T10: 00 + 03: 00 [Европа / София]

isDst: true

previousTransition = Transition [Разрыв в 2019-03-31T03: 00 + 02: 00 до +03: 00]

nextTransition = Переход [Перекрытие в 2019-10-27T04: 00 + 03: 00 до +02: 00]

nextTransitionInstant = 2019-10-27T01: 00: 00Z

nextTransactionZdt = 2019-10-27T03: 00 + 02: 00 [Европа / София]

isDstAfterTransition = false

Мы можем видеть, что следующий переход в Europe/Sofia произойдет в тот момент, когда будет выглядеть как 4:00, а на 3 часа больше UTC:

nextTransition = Transition[Overlap at 2019-10-27T04:00+03:00 to +02:00]

… но так как мы Летнее время (DST) «Откат», мы переводим стрелки часов на 3 часа ночи, чтобы опередить на 2 часа UTC:

nextTransactionZdt = 2019-10-27T03:00+02:00[Europe/Sofia]

И мыisDstAfterTransition может видеть, что в этот момент мы больше не в летнее время.

Обратите внимание, как в эту дату 27-го числа жители Софийского региона испытывают час 3-4 утра дважды . Эти первые 3-4 часа ночи на 3 часа опережают UTC. Второй 3-4 часа утра на 2 часа впереди UTC.

И это означает, что день 27-го будет длиться 25 часов, а не 24.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...