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)
但我不能使用它,因为我应该只使用缩写。
我的问题:
为什么两种格式给出不同的结果?
因为您的第一个表单实际上是“固定偏移”时区。“GMT+01:00”始终为 UTC+1。它实际上并不映射到世界的任何特定区域,它只是“始终 UTC+1”。
如何从缩写中获取全名,以便获得正确的输出?
你不能。即使您知道特定时刻的 UTC 偏移量,也可能有多个时区在该时刻具有该 UTC 偏移量,但在不同时间彼此具有不同的UTC 偏移量。
例如,目前欧洲/伦敦和非洲/阿比让都是 UTC+0...但在 2022 年 6 月(例如)非洲/阿比让仍然是 UTC+0,欧洲/伦敦是 UTC+1。
我不能使用它,因为我应该只使用缩写。
这是一个根本问题,你应该推迟这个要求。这就像说“我确实需要用户的全名,但我只有他们的姓名缩写。” 这是一个不可行的要求。
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |