我正在使用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
格式可以最大程度地减少代码中的歧义。