如何在Java中获得IANA格式的时区?

时间:2017-07-25 05:50:43

标签: java timezone timezone-offset

我的时区不是IANA格式,如PLTISTGMTNET等。如何将这些转换为IANA格式,如Asia/KarachiAsia/KolkattaEtc/Greenwich

我已使用TimeZone.getOffset()尝试使用偏移值,但仍需要IANA格式。

1 个答案:

答案 0 :(得分:1)

我想你已经读过这些评论,说明这几乎是不可能的,也是多么脆弱。无论如何,我正在提出一些建设性的建议。

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

我认为,下一个最安全的事情有点复杂:尝试ZoneId.of(yourNonIanaTimeZoneId)。这可能会给你一个ZoneId或者它会抛出异常(根据我的经验,通常是ZoneRulesException,但根据文档,它也可能会抛出其他DateTimeException)。它为GMT提供了ZoneId,但PLTISTNET都没有。例如,它确实为ZoneId提供EET。如果你有一个ZoneId,你就没有远,因为它的ID只是你给的ID。您现在可以执行的操作是搜索ZoneId.getAvailableZoneIds()以查看是否可以找到具有IANA名称和相同区域规则的区域。您只需要知道如何识别IANA名称;我认为它应该至少有一个斜线。

接下来要尝试,查看ZoneId.SHORT_IDS。例如,PLTISTNET都在那里。它们被翻译成亚洲/卡拉奇,亚洲/加尔各答和亚洲/埃里温。如果你想要,比如,爱尔兰夏令时,那你很糟糕。此外,SHORT_IDS并不总是会为您提供IANA名称,但有时只会提供-05:00之类的偏移量,但这并不能让您随时随地获取。对于执行此操作的三个条目,您可以对自己的转换进行硬编码,例如:

  • EST = America / New_York
  • HST = Pacific / Honolulu
  • MST = America / Denver

同样,如果对于美国东部时间你想要在澳大利亚的东部标准时间(也称为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我有亚洲/耶路撒冷,所以如果你更喜欢亚洲/加尔各答?但是,现在转换了以前方法无法处理的一些缩写,例如:

  • EST to America / New_York
  • EET(东欧时间)到欧洲/布加勒斯特
  • WET(西欧时间)到非洲/卡萨布兰卡

我不保证转换的质量,特别是最后一个在我眼中看起来很怪异。

使用风险自负! : - )