Для определенного года вы можете указать 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.