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

问题描述 投票:2回答:4

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

哪一个更好用?

java java-8 timezone jodatime java-time
4个回答
6
投票

引用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格式来最小化代码中的歧义。


3
投票

根据Java 8 Timezone documentationPST使用已被弃用,因为相同的缩写通常用于多个时区。这就是为什么首选使用America/Los_Angeles


2
投票

根据TZ数据库,更好的是使用“America / Los_Angeles”,因为这是有效的时区。看到这个LINK

为了与JDK 1.1.x兼容,还支持其他一些三字母时区ID(例如“PST”,“CTT”,“AST”)。但是,它们的使用已被弃用,因为相同的缩写通常用于多个时区(例如,“CST”可能是美国“中央标准时间”和“中国标准时间”),然后Java平台只能识别其中一个他们..

看到这个LINK

您还可以看到使用3个字母时区ID显示问题的THIS SO帖子。


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

链接

© www.soinside.com 2019 - 2024. All rights reserved.