LON和SYD之间的时差为9小时,具有夏时制

时间:2019-03-19 08:34:34

标签: datetime java-8 dst timezone-offset localdate

我对LON和亚太地区之间的时差感到困惑。如果使用英国夏令时,伦敦和新加坡之间的时差为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

如结果所示,悉尼4月的时差为9小时。谁能解释一下

1 个答案:

答案 0 :(得分:2)

今天(3月19日),悉尼仍在使用夏令时(DST)。南半球的夏季与北半球的冬季相吻合。到此为止。因此,尽管悉尼的标准时间是+10:00,但现在是+11:00。伦敦目前是标准时间+00:00。正如您所观察到的,相差11小时。

夏季时间从3月31日在伦敦(和欧盟)开始,使伦敦偏移+01:00,从而使时差减少到10小时。

夏季时间结束在悉尼于4月7日结束。它们返回其标准时间+10:00,进一步将伦敦和悉尼之间的时差减少到9小时,即您在4月观察到的时差。 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小时。