【问题标题】:What short timezone ids in the US are not recognized by Java ZoneId?Java ZoneId 无法识别美国的哪些短时区 ID?
【发布时间】:2020-04-08 23:38:21
【问题描述】:

我有一些代码可以从记录中读取一个短时区 id 并通过它传递:

ZoneId.of(ZoneId.SHORT_IDS.get(place.getTz()))

我无法控制使用哪些时区 ID,但我的印象是它始终是合法的短时区 ID。

我想情况是我需要询问“根据 WHICH STANDARD 的合法短时区 ID?”例如,我刚刚发现我们有一个时区 id 为“AKST”的记录,它对应于阿拉斯加标准时间。 Java ZoneId 类无法识别。

我的解决方法是为我知道需要支持但我知道 ZoneId 不支持的美国时区 ID 手动构建 ZoneId。我的清单现在只有一个条目。是否还有其他 ZoneId 不支持的“标准”(无论这意味着什么)短时区 ID?

【问题讨论】:

  • David 服务器端应该始终是 UTC 否?
  • 感谢您的回复,但我看不出这有什么关系,甚至不正确。
  • 大卫你能看看这里吗:stackoverflow.com/a/1707934/4828463
  • 我想这让我相信我不能真正依赖短 ID 的标准。无论如何,我发现我可以在所有记录中搜索唯一的 tz 值,而 AKST 是唯一的异常值,所以我可以忍受这一点。永远不可能出现具有不同时区的新记录。
  • 问题不在于支持哪些。您可以构建自己的地图,而不是 SHORT_IDS,然后随意放入其中。问题是有些时区不明确和/或不是真正的时区。如果有人在冬天指定 MDT(山地夏令时),你想抛出错误吗?如果他们相反地指定 MST(山地标准时间)为夏季的某个时间,您是否要将其解释为山地夏令时间(在大多数地方都会暗示)或山地标准时间(在亚利桑那州的部分地区使用)或严格的 UTC -07:00(在 1883 年之前甚至在亚利桑那州都没有使用过)?

标签: java timezone


【解决方案1】:

唯一支持的“短 ID”是 listed in the Java docs:

EST - -05:00
HST - -10:00
MST - -07:00
ACT - Australia/Darwin
AET - Australia/Sydney
AGT - America/Argentina/Buenos_Aires
ART - Africa/Cairo
AST - America/Anchorage
BET - America/Sao_Paulo
BST - Asia/Dhaka
CAT - Africa/Harare
CNT - America/St_Johns
CST - America/Chicago
CTT - Asia/Shanghai
EAT - Africa/Addis_Ababa
ECT - Europe/Paris
IET - America/Indiana/Indianapolis
IST - Asia/Kolkata
JST - Asia/Tokyo
MIT - Pacific/Apia
NET - Asia/Yerevan
NST - Pacific/Auckland
PLT - Asia/Karachi
PNT - America/Phoenix
PRT - America/Puerto_Rico
PST - America/Los_Angeles
SST - Pacific/Guadalcanal
VST - Asia/Ho_Chi_Minh

“AKST”可能是某些人使用的英文时区缩写,但它不是 Java Time API 支持的“Short ID”。

请记住,“短 ID”的概念仅仅是为了向后兼容那些已经在使用的旧 Java 应用程序。一般来说,使用几个字母来标识时区并不是一个好主意。模棱两可的地方太多了。例如,虽然“CST”代表“中部标准时间”并映射到此列表中的America/Chicago,但它也代表“古巴标准时间”(America/Havana)和“中国标准时间”(Asia/Shanghai) - 这里都没有映射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多