我正在使用Java 8,
在我们的代码前面,我们使用sdf.setTimeZone(TimeZone.getTimeZone("PDT"));
转换为美国太平洋地区,但由于 PDT 不是有效的 ZoneId,因此失败(未抛出任何错误,但转换为默认时区)。
所以我寻找TimeZone.getAvailableIDs()
值中也不可用setTimeZone(TimeZone.getTimeZone("PST"));
。
最后,我最终使用了sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
现在,我们的一位朋友使用setTimeZone(TimeZone.getTimeZone("PST"));
转换为美国太平洋时区,并且转换正在正常进行。
问题是,
TimeZone.getTimeZone("PST");
和TimeZone.getTimeZone("America/Los_Angeles");
有什么区别
哪一个更好用?
引用错误倾向的 ThreeLetterTimeZoneID 检查的文档:
根据
:java.util.TimeZone
的Javadoc为了与 JDK 1.1.x 兼容,还支持其他一些三个字母的时区 ID(例如"PST"、"CTT"、"AST")。但是,它们的使用已被弃用,因为相同的缩写通常用于多个时区(例如,"CST"可能是美国"中部标准时间"和"中国标准时间"),并且 Java 平台只能识别其中一个时区。
除了时区之间的歧义外,在 遵守返回时区的夏令时, 这意味着获得的时区可能不是您所期望的。例子 包括:
DateTime.getTimeZone("PST")
遵守夏令时; 但是,标识符暗示它是太平洋标准时间,即 不遵守夏令时。DateTime.getTimeZone("EST")
(以及"MST"
和"HST"
)不遵守夏令时。然而 这与 PST(和其他)不一致,因此您可能会认为 将遵守夏令时。
因此:使用完整的America/Los_Angeles
格式来最大程度地减少代码中的歧义。
根据 Java 8 时区文档,不推荐使用PST
,因为相同的缩写通常用于多个时区。 这就是为什么首选使用America/Los_Angeles
最好使用"America/Los_Angeles",因为根据TZ数据库,这是有效的时区。请参阅此链接。
为了与 JDK 1.1.x 兼容,还支持其他一些三个字母的时区 ID(例如"PST"、"CTT"、"AST")。但是,它们的使用已被弃用,因为相同的缩写通常用于多个时区(例如,"CST"可能是美国"中部标准时间"和"中国标准时间"),然后Java平台只能识别其中一个时区。
查看此链接
您还可以看到此SO帖子,其中显示了使用3个字母的时区ID的问题。
TL;DR不要使用 PST。使用美国/Los_Angeles。也不要使用TimeZone
类。使用ZoneId
.
- 可能指皮特凯恩标准时间、太平洋标准时间或菲律宾标准时间。
- 如果您将 PST 表示太平洋标准时间,则这不是时区,因为所有使用它作为标准时间的地方目前和一年中的大部分时间都是太平洋夏令时。
- 虽然过时的
TimeZone
类对 PST 的解释与美国/Los_Angeles相同,但正如其他人长期以来所说的那样,三个字母的缩写已被弃用。如果TimeZone
有一天(无论多么不可能)停止识别PST,它反而会给你GMT,这当然不是你想要的。
java.time
TimeZone
类设计不佳,有时令人困惑,幸运的是早已过时,取而代之的是 5 年前来自 java.time 的ZoneId
,即现代 Java 日期和时间 API。
一个简短的代码示例,可帮助您开始使用现代 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
(如果你坚持,有一个解决方法,但正如我们所说,你不应该)。
链接
- 时区缩写 – 全球列表
- PST – 太平洋标准时间/太平洋时间(标准时间)
- Oracle 教程:日期时间解释如何使用 java.time。