我正在使用Java 8,

在我们的代码的早期,由于PDT不是有效的ZoneId,我们使用sdf.setTimeZone(TimeZone.getTimeZone("PDT"));转换到失败的US Pacific(未引发任何错误,但转换为默认时区)。

所以我在寻找setTimeZone(TimeZone.getTimeZone("PST"));,它在TimeZone.getAvailableIDs()值中也不可用。

最后,我最终使用sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
现在,我们的一位朋友使用setTimeZone(TimeZone.getTimeZone("PST"));转换为美国太平洋时区,并且转换正常进行。

问题是
TimeZone.getTimeZone("PST");TimeZone.getTimeZone("America/Los_Angeles");有什么区别

哪个更好用?

最佳答案

引用Error Prone's ThreeLetterTimeZoneID check的文档:

根据java.util.TimeZone的Javadoc:


为了与JDK 1.1.x兼容,还支持其他三个字母的时区ID(例如“PST”,“CTT”,“AST”)。但是,不赞成使用它们,因为通常在多个时区使用相同的缩写(例如,“CST”可以是美国的“Central Standard Time”和“China Standard Time”),并且Java平台只能识别以下一种他们。


除了时区之间的歧义外,
在返回的时区遵守夏令时,
意味着获得的TimeZone可能不是您期望的。例子
包括:

DateTime.getTimeZone("PST")确实遵守夏令时;
但是,该标识符表示该时间为太平洋标准时间,即
没有遵守夏令时。 DateTime.getTimeZone("EST") (以及"MST""HST")不遵守夏令时。然而,
这与PST(及其他)不一致,因此您可能会认为
将遵守夏令时。

因此:使用完整的America/Los_Angeles格式可以最大程度地减少代码中的歧义。

07-27 13:45