API часового пояса Java 8 получает следующий переход, не возвращающий изменения летнего времени в Москве 1991 - PullRequest
6 голосов
/ 28 июня 2019

java.time.zone.ZoneRules#nextTransition не возвращает изменение DST Европы / Москвы 1991, что я не могу получить границу DST Европы / Москвы 1991. Европа / Москва ввели переход на летнее время в 1991-03-31 02:00, но также изменили свое стандартное смещение , поэтому смещение (+03: 00) остается неизменным, в то время как Java API не может использоваться для получения такого граница начала летнего времени.

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.zone.ZoneOffsetTransition;

public class TimeUtilTest {
    public static void main(String[] args) {
        ZoneId tz = ZoneId.of("Europe/Moscow");
        ZonedDateTime yearBegin = ZonedDateTime.of(1991, 1, 1, 0, 0, 0, 0, tz);
        ZoneOffsetTransition nextTransition = tz.getRules().nextTransition(yearBegin.toInstant());
        System.out.println("year begin isDST=" + tz.getRules().isDaylightSavings(yearBegin.toInstant()));
        System.out.println("next transition before is " + nextTransition.getDateTimeBefore() + " isDST=" + tz.getRules()
                .isDaylightSavings(nextTransition.getInstant().minusNanos(1)));
        System.out.println("next transition after is " + nextTransition.getDateTimeAfter() + " isDST=" + tz.getRules()
                .isDaylightSavings(nextTransition.getInstant().plusNanos(1)));
    }
}

Возвращается ниже

year begin isDST=false
next transition before is 1991-09-29T03:00 isDST=true
next transition after is 1991-09-29T02:00 isDST=false

где вы можете видеть, что isDST был неожиданно изменен перед переходом.

1 Ответ

2 голосов
/ 29 июня 2019

Ваши наблюдения верны.

Один из способов подтвердить изменение в марте 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.

Я не сделалЯ не вижу четкого вопроса в вашем Вопросе и не уверен, чего вы более точно ожидали от ответа.

Ссылка

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