我正在使用Java 8,
在我们代码的早期,我们使用sdf.setTimeZone(TimeZone.getTimeZone("PDT"));
转换为由于太平洋夏令时间(PDT)不是有效的ZoneId而失败(未引发任何错误,但转换为默认时区)的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");
有什么区别
使用哪种更好?
答案 0 :(得分:5)
引用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
格式以最小化代码中的歧义。
答案 1 :(得分:3)
根据Java 8 Timezone documentation,不赞成使用PST
,因为同一缩写通常用于多个时区。
这就是为什么首选使用America/Los_Angeles
答案 2 :(得分:2)
根据TZ数据库,最好使用“ America / Los_Angeles”,因为这是有效时区。参见此LINK。
为了与JDK 1.1.x兼容,还支持其他三个字母的时区ID(例如“ PST”,“ CTT”,“ AST”)。但是,不赞成使用它们,因为通常在多个时区使用相同的缩写(例如,“ CST”可以是美国的“ Central Standard Time”和“ China Standard Time”),并且Java平台只能识别以下一种他们。
查看此LINK
您还可以看到THIS这样的帖子,其中显示了使用3个字母的时区ID的问题。
答案 3 :(得分:1)
TL; DR 不要使用PST。使用America / Los_Angeles。也不要使用TimeZone
类。使用ZoneId
。
TimeZone
类对PST的解释与America / Los_Angeles相同,正如其他人早已说过的那样,但不赞成使用三个字母的缩写。如果TimeZone
一天(无论如何不太可能)停止识别PST,它就会给您GMT,这当然不是您想要的。 TimeZone
类的设计欠佳,有时会造成混淆,而且幸运的是,它已经过时了,由5年前的现代Java日期和时间API java.time中的ZoneId
取代。
一个简短的代码示例,可帮助您开始使用现代API:
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
.withLocale(Locale.US);
ZonedDateTime dateTime = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
System.out.println(dateTime.format(formatter));
2019年4月12日星期五太平洋夏令时间上午8:14:09
ZoneId
的一个优点是它不会轻易让您将PST
用作时区:ZoneId.of("PST")
会抛出java.time.zone.ZoneRulesException: Unknown time-zone ID: PST
(如果您坚持,则有一个解决方法,但正如我们所说,您不应该)。