Ваши наблюдения верны.
Один из способов подтвердить изменение в марте 1991 года: на странице timeanddate.com (часовой пояс и изменения часов) (см. Ссылку внизу) выберите 1990 - 1999из выпадающего списка.Я цитирую:
Year Date & Time Abbreviation Time Change Offset After
1991 søn 31. mar, kl. 02.00 MSK → EEST No offset (DST start, TZ change) UTC+3h
Правила зоны Java смоделированы с переходами, которые являются либо промежутками (стрелки часов повернуты вперед), либо перекрываются (часы повернуты назад).Поскольку ни одно из этих событий не произошло в марте 1991 года в Москве, правила зоны не могут по-настоящему моделировать переход, поэтому, очевидно, он был выбран, чтобы исключить его.Возможно, мы могли бы представить себе разрыв и наложение друг на друга и сбалансировать друг друга, но я не думаю, что это тоже сработало бы.
Ява знает оизмениться, хотя.Попробуйте, например,
ZoneRules moscowRules = tz.getRules();
Instant justBeforeChange = ZonedDateTime.of(1991, 3, 31, 1, 59, 59, 999_999_999, tz).toInstant();
System.out.println(moscowRules.getStandardOffset(justBeforeChange));
System.out.println(moscowRules.isDaylightSavings(justBeforeChange));
Instant onChange = ZonedDateTime.of(1991, 3, 31, 2, 0, 0, 0, tz).toInstant();
System.out.println(moscowRules.getStandardOffset(onChange));
System.out.println(moscowRules.isDaylightSavings(onChange));
Это напечатает:
+03:00
false
+02:00
true
Вы также правы, что нет способа напрямую запросить объект ZoneRules
о том, когда это изменение произошло.Если вам нужно сделать это, бинарный поиск сузит его до 1991-03-30T23: 00: 00Z, так же, как 1991-03-31T02: 00: 00 + 03: 00.
Я не сделалЯ не вижу четкого вопроса в вашем Вопросе и не уверен, чего вы более точно ожидали от ответа.
Ссылка