Java TimeZone.getTimeZone(“ PDT”)无法正常工作

Nat*_*n W 3 java timezone

它返回GMT的默认时区。

在时区中使用带有“ z”的SimpleTimeFormat,它将打印“ PDT”。但是“ PDT”不在TimeZone.getAvailableIDs()返回的列表中。真奇怪!

谁知道为什么“ PDT”不是标准的tz?该如何处理?有人调用我的API,并将“ PDT”作为时区传递。谢谢。

Bas*_*que 7

PDT 不是时区

谁知道为什么“ PDT”不是标准的tz?

因为“ PDT”不是时区!

“ PDT”是一种伪时区,媒体使用它来伪装地指示一组时区以及一个指示符,如果它们打算在启用夏令时(DST)的时间段(PST)中显示。避免使用这2-4个字母代码,因为它们不是真实的时区,不是标准化的,甚至也不是唯一的(!)。

正确的时区名称

指定适当的时区名称,格式continent/region,如America/MontrealAfrica/CasablancaPacific/Auckland

PDT这些时区中的任何一个或更多时区可能是预期的:

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
ZoneId z = ZoneId.of( "America/Tijuana" ) ;
ZoneId z = ZoneId.of( "America/Whitehorse" ) ;
Run Code Online (Sandbox Code Playgroud)

但是PDT可能并不意味着该区域,因为亚利桑那州不参与夏令时(DST)的废话,而D中间的则表示DST。

ZoneId z = ZoneId.of( "America/Phoenix" ) ;
Run Code Online (Sandbox Code Playgroud)

避免使用旧的日期时间类

避免使用SimpleTimeFormat类,因为它是麻烦的旧日期时间类的一部分,而现在这些日期时间类已被java.time类所取代。使用DateTimeFormatter代替。

也要避免TimeZone。替换为ZoneId

通过ZoneId,不是字符串

有人调用我的API,并将“ PDT”作为时区传递。

更改您的API,以a ZoneId作为参数,而不是单纯的String。这样可以确保有效值并为您提供类型安全性


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


Mat*_*int 4

“PDT”是太平洋夏令时的缩写。它与太平洋标准时间一起组成太平洋时区。

太平洋时区的时区标识符是"America/Los_Angeles"。你应该用它来代替。

阅读时区标签 wikiWikipedia 关于 tz 数据库的文章