我有一些时区不是PLT,IST,GMT,NET等。如何用Asia/Karachi、Asia/Kolkatta、Etc/Greenwich等java格式将这些时区转换成IANA格式。
我尝试过使用TimeZone.getOffset()来处理偏移值,但它仍然需要IANA格式。
发布于 2017-07-25 13:08:25
我想你已经读到了这些评论,说明这是多么(几乎)不可能,多么脆弱。我还是大胆地提出了一些建设性的建议。
首先,您当然可以特别处理GMT和UTC,因为它们的解释相当安全,您可能希望确保它们得到处理。
我认为,接下来最安全的事情是有点复杂:试试ZoneId.of(yourNonIanaTimeZoneId)。这要么给您一个ZoneId,要么抛出一个异常(在我的经验中通常是一个ZoneRulesException,但根据文档,它还可能抛出其他一些DateTimeException)。它给了我一个格林尼治标准时间的ZoneId,但没有给PLT,IST和NET。例如,它确实为EET提供了一个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。在Java8中,他们将短In (已不再推荐使用)提取到ZoneId.SHORT_IDS中,并在ZoneId.getAvailableZoneIds()中包含所有其他in。因此,来自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,我得到了亚洲/耶路撒冷,那么如果你喜欢这个而不是亚洲/加尔各答?但是,一些以前的方法无法处理的缩略语现在被转换,例如:
我不能保证转换的质量,尤其是最后一次在我眼里看上去很恐怖。
自费使用!:)
https://stackoverflow.com/questions/45294889
复制相似问题