TimeZone.getTimeZone(“ PST”)与TimeZone.getTimeZone(“ America / Los_Angeles”)

时间:2019-04-11 08:06:51

标签: java java-8 timezone jodatime java-time

我正在使用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");有什么区别

使用哪种更好?

4 个答案:

答案 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

  • PST可能表示皮特凯恩标准时间,太平洋标准时间或菲律宾标准时间。
  • 如果您将PST表示为太平洋标准时间,则该时间段不是一个时区,因为所有使用它作为标准时间的地点都是当前时间,并且大部分时间都在太平洋夏令时。
  • 尽管过时的TimeZone类对PST的解释与America / Los_Angeles相同,正如其他人早已说过的那样,但不赞成使用三个字母的缩写。如果TimeZone一天(无论如何不太可能)停止识别PST,它就会给您GMT,这当然不是您想要的。

java.time

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(如果您坚持,则有一个解决方法,但正如我们所说,您不应该)。

链接