我的时区不是IANA格式,如PLT
,IST
,GMT
,NET
等。如何将这些转换为IANA格式,如Asia/Karachi
,Asia/Kolkatta
,Etc/Greenwich
等
我已使用TimeZone.getOffset()
尝试使用偏移值,但仍需要IANA格式。
答案 0 :(得分:1)
我想你已经读过这些评论,说明这几乎是不可能的,也是多么脆弱。无论如何,我正在提出一些建设性的建议。
首先,您当然可以特别处理GMT和UTC,因为这些解释相当安全,您可能希望确保它们得到处理。
我认为,下一个最安全的事情有点复杂:尝试ZoneId.of(yourNonIanaTimeZoneId)
。这可能会给你一个ZoneId
或者它会抛出异常(根据我的经验,通常是ZoneRulesException
,但根据文档,它也可能会抛出其他DateTimeException
)。它为GMT提供了ZoneId
,但PLT
,IST
和NET
都没有。例如,它确实为ZoneId
提供EET
。如果你有一个ZoneId
,你就没有远,因为它的ID只是你给的ID。您现在可以执行的操作是搜索ZoneId.getAvailableZoneIds()
以查看是否可以找到具有IANA名称和相同区域规则的区域。您只需要知道如何识别IANA名称;我认为它应该至少有一个斜线。
接下来要尝试,查看ZoneId.SHORT_IDS
。例如,PLT
,IST
和NET
都在那里。它们被翻译成亚洲/卡拉奇,亚洲/加尔各答和亚洲/埃里温。如果你想要,比如,爱尔兰夏令时,那你很糟糕。此外,SHORT_IDS
并不总是会为您提供IANA名称,但有时只会提供-05:00
之类的偏移量,但这并不能让您随时随地获取。对于执行此操作的三个条目,您可以对自己的转换进行硬编码,例如:
同样,如果对于美国东部时间你想要在澳大利亚的东部标准时间(也称为AEST或AET),那你就错了。你会一遍又一遍地遇到这些含糊之处。
您在评论中询问是否可以使用TimeZone.getAvailableIDs()
。你可以,但它没有给你任何你从上面得不到的东西。就我而言,我宁愿使用现代课程ZoneId
而不是过时的TimeZone
。在Java 8中,他们将短ID(已弃用)用于ZoneId.SHORT_IDS
,并在ZoneId.getAvailableZoneIds()
中包含所有其他ID。因此,TimeZone.getAvailableIDs()
中的每个ID都位于ZoneId.getAvailableZoneIds()
或ZoneId.SHORT_IDS
。
我的最后一个建议,我认为它很脏,它可能不会给你你想要的东西:
SimpleDateFormat sdf = new SimpleDateFormat("z");
sdf.parse(yourNonIanaTimeZoneId);
String ianaName = sdf.getTimeZone().getID();
我正在使用已过时的SimpleDateFormat
课程,所以我对此并不满意。对于PLT和NET,它会抛出ParseException
。对于GMT,它只是给了我JVM的默认时区!对于IST我有亚洲/耶路撒冷,所以如果你更喜欢亚洲/加尔各答?但是,现在转换了以前方法无法处理的一些缩写,例如:
我不保证转换的质量,特别是最后一个在我眼中看起来很怪异。
使用风险自负! : - )