Разница во времени между LON и SYD составляет 9 часов с переходом на летнее время - PullRequest
0 голосов
/ 19 марта 2019

Меня смущает разница во времени между регионами LON и APAC. С учетом летнего времени Великобритании разница во времени между Лондоном и Сингапуром составляет 7 часов, а без перехода на летнее время - 8 часов.

Но разница во времени в Сиднее составляет 9 часов при экономии дневного света и 11 часов без экономии дневного света. Поэтому мой вопрос: почему между LON и SYD

разница в один час больше?

Я проверил это с приведенным ниже кодом с системным часовым поясом как Лондон

@Test
    public void datetimetest(){
        LocalDateTime dt1 = LocalDateTime.of(2019, 3, 19, 11, 0);
        LocalDateTime dt2 = LocalDateTime.of(2019, 4, 19, 11, 0);
        ZonedDateTime zonedDateTimeLon1 = dt1
                .atZone(systemDefault())
                .withZoneSameInstant(ZoneId.of("Europe/London"));
        ZonedDateTime zonedDateTimeLon2 = dt2
                .atZone(systemDefault())
                .withZoneSameInstant(ZoneId.of("Europe/London"));
        printZonedDateTime(zonedDateTimeLon1, "Europe/London");
        printZonedDateTime(zonedDateTimeLon1, "Australia/Sydney");
        printZonedDateTime(zonedDateTimeLon1, "Asia/Singapore");

        printZonedDateTime(zonedDateTimeLon2, "Europe/London");
        printZonedDateTime(zonedDateTimeLon2, "Australia/Sydney");
        printZonedDateTime(zonedDateTimeLon2, "Asia/Singapore");
    }



private static void printZonedDateTime(ZonedDateTime zonedDateTimeLon, String timeZone) {
        LocalDateTime dateTime = zonedDateTimeLon
                .withZoneSameInstant(ZoneId.of(timeZone))
                .toLocalDateTime();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(timeZone + "= " + dateTimeFormatter.format(dateTime));
    }


Result:

Europe/London= 2019-03-19 11:00:00
Australia/Sydney= 2019-03-19 22:00:00
Asia/Singapore= 2019-03-19 19:00:00
Europe/London= 2019-04-19 11:00:00
Australia/Sydney= 2019-04-19 20:00:00
Asia/Singapore= 2019-04-19 18:00:00

Как показано в результатах, разница во времени в апреле составляет 9 часов для Сиднея. Может кто-нибудь, пожалуйста, объясните это

1 Ответ

2 голосов
/ 19 марта 2019

Сегодня (19 марта) Сидней все еще использует летнее время (DST).Лето в южном полушарии совпадает с зимой в северном.Так что это заканчивается в это время.Таким образом, хотя стандартное время в Сиднее составляет +10: 00, сейчас оно составляет +11: 00.Лондон в настоящее время на стандартном времени, +00: 00.Таким образом, разница, как вы заметили, составляет 11 часов.

Летнее время начинается в Лондоне (и ЕС) 31 марта, в результате чего Лондон со смещением +01: 00, в свою очередь, сокращает разницу до 10 часов.

Летнее время заканчивается в Сиднее 7 апреля. Они возвращаются к своему стандартному смещению +10: 00, еще больше уменьшая разницу между Лондоном и Сиднеем до 9 часов, разницу, которую вы наблюдали для19 апреля.

Или в коде:

    ZoneId london = ZoneId.of("Europe/London");
    ZoneId sydney = ZoneId.of("Australia/Sydney");
    Instant instMarch = Instant.parse("2019-03-19T00:00:00Z");
    Instant instApril = Instant.parse("2019-04-19T00:00:00Z");
    System.out.println(instMarch.atZone(london));
    System.out.println(instMarch.atZone(sydney));
    System.out.println(instApril.atZone(london));
    System.out.println(instApril.atZone(sydney));

Вывод:

2019-03-19T00:00Z[Europe/London]
2019-03-19T11:00+11:00[Australia/Sydney]
2019-04-19T01:00+01:00[Europe/London]
2019-04-19T10:00+10:00[Australia/Sydney]

Обратите внимание, что текущие смещения печатаются (Z в первой строке вывода означает смещение нуля).

Сингапур, в свою очередь, не использует летнее время (по крайней мере, не в 2019 году), поэтому здесь разница уменьшается только с 8 до 7 часов, когда летнее времяначинается в Лондоне.

...