时区的全名和缩写有什么区别

YCF*_*F_L 0 java timezone java-time

我的数据库中有多次如下所示:

String summerTime = "2022-07-21T10:00:00Z";
String winterTime = "2022-11-21T10:00:00Z";
Run Code Online (Sandbox Code Playgroud)

另一方面,我想根据自定义时区获取这些日期的时间部分,我拥有的时区如下所示:

GMT-03:00
GMT-02:00
GMT-01:00
GMT+02:00
GMT+01:00
....
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下代码提取时间部分时:

ZoneId tz = ZoneId.of("GMT+01:00");

ZonedDateTime date1 = ZonedDateTime.parse(summerTime).withZoneSameInstant(tz.toZoneId());
ZonedDateTime date2 = ZonedDateTime.parse(winterTime).withZoneSameInstant(tz.toZoneId());
Run Code Online (Sandbox Code Playgroud)

我得到:

11:00
11:00
Run Code Online (Sandbox Code Playgroud)

但如果您仔细观察,即使在夏季或冬季约会,时间也是相同的。

我期望得到:

12:00  // <----- correct
11:00  // <----- correct
Run Code Online (Sandbox Code Playgroud)

我找到了解决问题的方法,即使用时区的全名而不是缩写:

ZoneId tz = ZoneId.of("Europe/Paris");
Run Code Online (Sandbox Code Playgroud)

这给了我正确的回应:

12:00
11:00
Run Code Online (Sandbox Code Playgroud)

但我不能使用它,因为我应该只使用缩写。

我的问题:

  • 为什么两种格式给出不同的结果?
  • 如何从缩写中获取全名,以便获得正确的输出?

Jon*_*eet 7

为什么两种格式给出不同的结果?

因为您的第一个表单实际上是“固定偏移”时区。“GMT+01:00”始终为 UTC+1。它实际上并不映射到世界的任何特定区域,它只是“始终 UTC+1”。

如何从缩写中获取全名,以便获得正确的输出?

你不能。即使您知道特定时刻的 UTC 偏移量,也可能有多个时区在该时刻具有该 UTC 偏移量,但在不同时间彼此具有不同的UTC 偏移量。

例如,目前欧洲/伦敦和非洲/阿比让都是 UTC+0...但在 2022 年 6 月(例如)非洲/阿比让仍然是 UTC+0,欧洲/伦敦是 UTC+1。

我不能使用它,因为我应该只使用缩写。

这是一个根本问题,你应该推迟这个要求。这就像说“我确实需要用户的全名,但我只有他们的姓名缩写。” 这是一个不可行的要求。