我处于+07:00时区。
鉴于此:
ZonedDateTime.of( LocalDateTime.of( 1899, 12, 31, 23, 9, 20, 0 ), ZoneOffset.UTC )
.withZoneSameInstant( ZoneId.of( "Europe/Paris" ) )
会产生:1899-12-31T23:18:41+00:09:21[Europe/Paris]
另一方面:
ZonedDateTime.of( LocalDateTime.of( 1899, 12, 31, 23, 9, 20, 0 ), ZoneOffset.UTC )
.withZoneSameInstant( ZoneId.of( "GMT+1" ) )
会产生:1900-01-01T00:09:20+01:00[GMT+01:00]
为什么它们不同,因为ZoneId.of( "Europe/Paris" ).getRules().getOffset( LocalDateTime.now() )
和都ZoneId.of( "GMT+1" ).getRules().getOffset( LocalDateTime.now() )
产生+01:00
?我希望第一次尝试应该会得到1900-01-01T00:09:20+01:00[Europe/Paris]
。顺便问一下,第一次尝试时在哪里+00:09:21
?
您说得对
Europe/Paris
,现在GMT+1
具有相同的偏移量(2025-02-09),但在 1899 年它们并没有相同的偏移量。让我们打印出
Instant
你真正感兴趣的偏移量,这将打印
这就是 +00:09:21 的由来。巴黎直到 1911 年才统一时区。它比格林威治标准时间早 9 分 21 秒,因为巴黎位于格林威治标准时间以东 9 分 21 秒。这是巴黎当地平均时间与格林威治标准时间的偏差。
的时区偏移
Europe/Paris
在历史上发生了很大变化。有关更多详细信息,请参阅 维基百科。或者,您可以直接打印Sweeper 的回答很正确也很聪明。我只是补充一些想法。
时区跟踪非常新颖
正如另一个答案中所建议的那样,让我们来看看巴黎地区人民使用的偏移量变化的历史,这些变化是由他们的政治家决定的。
我们发现巴黎地区在不同时期使用了四个偏移量:
您认为巴黎时间始终使用 +01:00(GMT+1)的偏移量,这是不正确的。
我们看到,该地区的时区追踪只能追溯到 1911 年。在铁路时代之前,几乎不需要设计一个时区。唯一重要的时间是显而易见的自然时间:中午是太阳直射头顶的时间,无论你站在哪里。中午在东部比在西部来得早。
正如Wikipedia所述,1891 年,法国本土的时间通过穿过法国巴黎天文台的巴黎子午线统一了。该子午线恰好位于我们当代使用 UTC 时区定义所使用的格林威治子午线以东 ≈ 2°20′。2 °20′ 的经度距离意味着太阳直射巴黎人头顶的时间比太阳直射伦敦人头顶的时间早约 9 分 21 秒。因此,巴黎的第一个法国偏移量定义为比巴黎子午线早 +00:00。如今,我们对那个时代的现代官方时区定义是比UTC 子午线早 +00:09:21,以解释 2°20′ 的差异。这解释了您在结果中看到的偏移量。
Europe/Paris
所有这些都是在用冗长的方式表明,尝试使用当代时间之外的时区几乎没有意义:
令人震惊的是,尽管我们拥有众多大学和政府机构,却没有人费心识别时区并跟踪时差的变化。只有在我们(白发苍苍)的有生之年,Arthur David Olson 才英勇地建立了一个正式的时区数据库,2005 年,责任移交给了 Paul Eggert。他们的努力主要集中在 1970 年及以后,每年对我们现在称为tzdata 的内容进行多次编辑、添加、更正和更改。
因此,您试图精确地表示 1899 年的某个时刻是不明智的。
OffsetDateTime
让我们分解一下你的代码。
虽然并不重要,但您在第一部分中的使用
ZonedDateTime
具有误导性。您分配的只是一个偏移量,而不是时区。所以您应该使用OffsetDateTime
。但如上所述,使用
OffsetDateTime
或ZonedDateTime
表示历史时刻通常是不明智的。它们的使用表明了一种不可能的、也可能是不必要的精确性和权威性。定义:
+
表示子午线之前,-
使用 表示子午线之后,但请注意某些协议的作用相反。Continent/Region
为Europe/London
、Europe/Paris
、America/Edmonton
、Pacific/Auckland
等。