Android + (Java 时间或 ThirteenTenABP) ZonedDateTime.of 产生意外结果
Android + (Java Time or ThirteenTenABP) ZonedDateTime.of yields unexpected result
上下文
- 这是 Android 应用程序 运行 API 29(最小值为 23)。
- 我正在使用 ThirteenTenABP
问题
我只是在调试一些代码并执行以下操作:
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
因此它会使用当时正在使用的时区为您返回时间,而不是荷兰当前使用的时区。
上下文
- 这是 Android 应用程序 运行 API 29(最小值为 23)。
- 我正在使用 ThirteenTenABP
问题
我只是在调试一些代码并执行以下操作:
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
因此它会使用当时正在使用的时区为您返回时间,而不是荷兰当前使用的时区。