我正在使用Java 8,
在我们的代码中,我们使用sdf.setTimeZone(TimeZone.getTimeZone("PDT"));
转换为US Pacific,由于PDT不是有效的ZoneId,因此失败了(没有丢失任何错误但转换为默认时区)。
所以我寻找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”可能是美国“中央标准时间”和“中国标准时间”),然后Java平台只能识别其中一个他们。
除了时区之间的模糊之外,返回时区遵守夏令时的方式也不一致,这意味着获得的TimeZone可能与您的预期不符。例子包括:
DateTime.getTimeZone("PST")
确实观察夏令时;但是,标识符暗示它是太平洋标准时间,即没有观察到夏令时。DateTime.getTimeZone("EST")
(和"MST"
和"HST"
)没有观察夏令时。但是,这与PST(和其他)不一致,因此您可能会认为会观察到夏令时。
所以:使用完整的America/Los_Angeles
格式来最小化代码中的歧义。
根据Java 8 Timezone documentation,PST
使用已被弃用,因为相同的缩写通常用于多个时区。这就是为什么首选使用America/Los_Angeles
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
(如果你坚持有一个解决方法,但正如我们所说,你不应该)。