LocalDate 未显示正确日期的 Java 时区问题

Java Timezone issue with LocalDate not showing correct date

提问人:Joao Pedro 提问时间:7/26/2023 最后编辑:Mark RotteveelJoao Pedro 更新时间:7/27/2023 访问量:65

问:

我目前在欧洲/伦敦工作

我正在尝试使用以下代码获取萨摩亚的当前日期,即 7 月 27 日:

LocalDate localDate = LocalDate.now(ZoneId.of("Pacific/Samoa"));

但是,由于某种原因,这输出为:

2023-07-26

目前是伦敦时间7月26日16:47,萨摩亚时间是7月27日4:47。

我不明白如果我使用萨摩亚 zoneId,为什么我会得到 26 作为输出。

java 时区 localdate zoneid

评论

1赞 Mark Rotteveel 7/26/2023
你错了,目前是 26 7月 2023 04:54 在萨摩亚,而现在是 26 7月 2023 16:54 在伦敦。请参见 timeanddate.com/worldclock/american-samoa。它有 UTC -11,而不是 UTC +11
0赞 7/26/2023
@MarkRotteveel萨摩亚和美属萨摩亚不是同一个国家:timeanddate.com/worldclock/samoa
2赞 Mark Rotteveel 7/27/2023
@OHGODSPIDERS 当然,但太平洋/萨摩亚现在指的是美属萨摩亚(过去也指萨摩亚)。萨摩亚的一个是太平洋/阿皮亚
0赞 Mark Rotteveel 7/27/2023
@OHGODSPIDERS 你说得对,我太关注时区而不是国家:)

答:

-1赞 Loz 7/26/2023 #1

根据文档,您需要使用 of 来获取萨摩亚时间。ZoneIdPacific/Pago_Pago

编辑:正如乔恩在下面更正的那样;我链接到的文档是旧的,是一个可接受的 ID。Pacific/Samoa

评论

0赞 Jon Skeet 7/26/2023
这看起来像是一张相当古老的桌子(如果相信的话 docs.oracle.com/middleware/1221/wcs/tag-ref/index.html 2015年)。 是一个非常好的时区 ID。 Mark Rotteveel 的评论是 IMO 更合适的回应。Pacific/Samoa
1赞 Mark Rotteveel 7/27/2023
Pacific/Pago_Pago 是 Pacific/Samoa 的别名,或者至少也是 7 月 26 日。
3赞 Mark Rotteveel 7/27/2023 #2

问题在于,太平洋/萨摩亚不再是萨摩亚的时区,而只是美属萨摩亚的时区。在美属萨摩亚,目前是 7 月 26 日 05:07(欧洲/阿姆斯特丹 7 月 26 日 18:07)。

几年前(2011 年),萨摩亚越过国际日期变更线,产生了一个新的时区,您需要使用太平洋/阿皮亚时区:

jshell> LocalDate.now(ZoneId.of("Pacific/Apia"))
$3 ==> 2023-07-27
jshell> LocalDateTime.now(ZoneId.of("Pacific/Apia"))
$4 ==> 2023-07-27T05:07:08.188250

评论

2赞 7/27/2023
作为快速旁注,人们始终可以打印 ZoneId 的规则以检查它们的实际偏移量。eG 将显示,而 ZoneId 将显示 。在调试时,了解实际偏移值无疑是一个有用的工具。ZoneId.of("Pacific/Samoa").getRules()currentStandardOffset=-11:00ZoneId.of("Pacific/Apia").getRules()currentStandardOffset=+13:00