首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用java获取IANA格式的时区?

如何用java获取IANA格式的时区?
EN

Stack Overflow用户
提问于 2017-07-25 05:50:43
回答 1查看 3.2K关注 0票数 2

我有一些时区不是PLTISTGMTNET等。如何用Asia/KarachiAsia/KolkattaEtc/Greenwich等java格式将这些时区转换成IANA格式。

我尝试过使用TimeZone.getOffset()来处理偏移值,但它仍然需要IANA格式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-25 13:08:25

我想你已经读到了这些评论,说明这是多么(几乎)不可能,多么脆弱。我还是大胆地提出了一些建设性的建议。

首先,您当然可以特别处理GMT和UTC,因为它们的解释相当安全,您可能希望确保它们得到处理。

我认为,接下来最安全的事情是有点复杂:试试ZoneId.of(yourNonIanaTimeZoneId)。这要么给您一个ZoneId,要么抛出一个异常(在我的经验中通常是一个ZoneRulesException,但根据文档,它还可能抛出其他一些DateTimeException)。它给了我一个格林尼治标准时间的ZoneId,但没有给PLTISTNET。例如,它确实为EET提供了一个EET。如果您有一个ZoneId,那么您没有得到多远,因为它的ID将是您提供的ID。您现在可以做的是通过ZoneId.getAvailableZoneIds()搜索,看看是否可以找到一个带有IANA名称和相同区域规则的区域。你只需要知道如何识别一个IANA的名字,我想它至少应该有一个斜线。

接下来要尝试的是,在ZoneId.SHORT_IDS中查找。例如,所有的PLTISTNET都在那里。它们被翻译到亚洲/卡拉奇、亚洲/加尔各答和亚洲/埃里温。如果你想,比方说,爱尔兰夏季时间,你的生活很糟糕。而且,SHORT_IDS不会总是给你一个IANA的名字,但有时只是一个偏移,如-05:00,这并没有真正使你任何地方。对于执行此操作的三个条目,可以对自己的转换进行硬编码,例如:

  • EST =美国/纽约
  • HST =太平洋/檀香山
  • MST =美国/丹佛

同样,如果你想要在澳大利亚的东部标准时间(也称为AEST或AET),你就错了。你会一次又一次地遇到这些模棱两可之处。

您在评论中询问是否可以使用TimeZone.getAvailableIDs()。你可以,但它不会给你从上面得不到的任何东西。就我而言,我更喜欢使用现代类ZoneId而不是过时的TimeZone。在Java8中,他们将短In (已不再推荐使用)提取到ZoneId.SHORT_IDS中,并在ZoneId.getAvailableZoneIds()中包含所有其他in。因此,来自TimeZone.getAvailableIDs()的每个ID都在ZoneId.getAvailableZoneIds()ZoneId.SHORT_IDS中。

我的最后一个建议,我认为这是肮脏的,它可能不会给你你想要的:

代码语言:javascript
复制
    SimpleDateFormat sdf = new SimpleDateFormat("z");
    sdf.parse(yourNonIanaTimeZoneId);
    String ianaName = sdf.getTimeZone().getID();

我使用的是长期过时的SimpleDateFormat类,所以我对它不太满意。对于PLT和NET,它抛出一个ParseException。对于GMT,它只是给了我JVM的默认时区!对于IST,我得到了亚洲/耶路撒冷,那么如果你喜欢这个而不是亚洲/加尔各答?但是,一些以前的方法无法处理的缩略语现在被转换,例如:

  • 去美国/纽约的航班。
  • 东欧时间至欧洲/布加勒斯特
  • 湿(西欧时间)至非洲/卡萨布兰卡

我不能保证转换的质量,尤其是最后一次在我眼里看上去很恐怖。

自费使用!:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45294889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档