提问人:Joao Pedro 提问时间:7/26/2023 最后编辑:Mark RotteveelJoao Pedro 更新时间:7/27/2023 访问量:65
LocalDate 未显示正确日期的 Java 时区问题
Java Timezone issue with LocalDate not showing correct date
问:
我目前在欧洲/伦敦工作
我正在尝试使用以下代码获取萨摩亚的当前日期,即 7 月 27 日:
LocalDate localDate = LocalDate.now(ZoneId.of("Pacific/Samoa"));
但是,由于某种原因,这输出为:
2023-07-26
目前是伦敦时间7月26日16:47,萨摩亚时间是7月27日4:47。
我不明白如果我使用萨摩亚 zoneId,为什么我会得到 26 作为输出。
答:
-1赞
Loz
7/26/2023
#1
根据文档,您需要使用 of 来获取萨摩亚时间。ZoneId
Pacific/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:00
ZoneId.of("Pacific/Apia").getRules()
currentStandardOffset=+13:00
评论