Datetime 使用夏令时,LON和SYD之间的时差为9小时

Datetime 使用夏令时,LON和SYD之间的时差为9小时,datetime,java-8,dst,timezone-offset,localdate,Datetime,Java 8,Dst,Timezone Offset,Localdate,我对伦敦和亚太地区的时差感到困惑。使用英国日光节约,伦敦和新加坡之间的时差为7小时,如果不使用日光节约,则为8小时 但在悉尼,白天节光的时差为9小时,而不节光的时差为11小时。 所以我的问题是为什么LON和SYD之间有额外的一个小时的差异 我已经用以下代码测试了这一点,系统时区为伦敦 @Test public void datetimetest(){ LocalDateTime dt1 = LocalDateTime.of(2019, 3, 19, 11, 0);

我对伦敦和亚太地区的时差感到困惑。使用英国日光节约,伦敦和新加坡之间的时差为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小时。今天(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));
输出为:

请注意,打印当前偏移量(
Z
在第一个输出行中表示偏移量为零)

新加坡不使用夏季时间(至少在2019年不使用),因此,当夏季时间在伦敦开始时,两者之间的差异仅从8小时减少到7小时。

今天(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));
输出为:

请注意,打印当前偏移量(
Z
在第一个输出行中表示偏移量为零)


新加坡不使用夏季时间(至少在2019年不使用),因此当夏季时间在伦敦开始时,差异仅从8小时减少到7小时。

理解,感谢解释。YouTube上描述了这一确切场景(从T03:50开始)理解,感谢您的解释。YouTube上描述了这个确切的场景(从T03:50开始)