我对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小时。任何人都可以解释一下
今天(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小时。