Android + (Java 时间或 ThirteenTenABP) ZonedDateTime.of 产生意外结果

Android + (Java Time or ThirteenTenABP) ZonedDateTime.of yields unexpected result

上下文

问题

我只是在调试一些代码并执行以下操作:

val zonedDateTime = ZonedDateTime.of(
                          LocalDateTime.of(1900, 1, 1, 15, 15, 0),
                          ZoneId.of("Europe/Amsterdam"))

这会将 (toString() 打印为:

1900-01-01T15:15+00:19:32[Europe/Amsterdam]

预计

我本以为会看到 1900-01-01T15:15+02:00:00[Europe/Amsterdam] 或类似内容。

由于夏令时,阿姆斯特丹当前与 UTC 的偏移量为 +2。然而,我看到了这19分32秒。

这意味着如果我使用类似以下内容将该分区日期时间转换为 UTC:

val utcZoned = zonedDateTime.withZoneSameInstant(ZoneOffset.UTC)

我得到(与上面的错误一致):

1900-01-01T14:55:28Z

所以它是 14:55:28 或相当于时间 15:15(下午 3:15)减去 19 分三十二秒。

我是不是漏掉了什么?

我在模拟器上 运行。 ZoneId.getSystemDefault() 也 returns 相同的 ZoneId + 偏移量。我开始对阿姆斯特丹进行硬编码,看看是否能发现不同之处。

另一种查看方式,只需执行以下操作:

ZonedDateTime.of(LocalDateTime.of(1900,01,01,15,15,0), ZoneId.of("Europe/Amsterdam")).offset

结果是 ZoneOffset

与上面的 19 分钟一致:

偏移量为:+00:19:32

我在这里做错了什么?

我试过了吗java.time.*

是的,我删除了 ThirteenTenABP,并在 Android O (8.x) 上替换了对 java.time.* 和 运行 的所有导入,以查看原生 Java8 时间 类 会产生类似的结果,答案是:是的。

偏移量来自偏移量规则:

但为什么是这些数字?

看起来是正确的,阿姆斯特丹的时区 used to be based off of the time in Westerkerk

The reason for the specific offset of +0h 19m 32.13s was that the time zone was centered on the mean solar time of the Westertoren (4° 53' 01.95" E Longitude), the tower of the Westerkerk church in Amsterdam.

https://en.wikipedia.org/wiki/UTC%2B00:20

切记 docs for ZonedDateTime.of

The local date-time is then resolved to a single instant on the time-line

因此它会使用当时正在使用的时区为您返回时间,而不是荷兰当前使用的时区。