它返回 GMT 的默认时区。
使用带有“z”作为时区的 SimpleTimeFormat,打印“PDT”。但是“PDT”不在从 TimeZone.getAvailableIDs() 返回的列表中。真奇怪!
有谁知道为什么“PDT”不是标准的 tz?如何处理?有人调用我的 API,传入“PDT”作为时区。谢谢。
最佳答案
PDT
不是时区
Anyone knows why "PDT" is not a standard tz?
因为“PDT”不是时区!
“PDT”是媒体使用的伪时区,用于模糊地指示一组时区加上一个指示符,如果他们打算在 Daylight Saving Time (DST) 期间使用。是否参与 (PST
)。避免使用这些 2-4 个字母的代码,因为它们不是真正的时区,没有标准化,甚至不是唯一的(!)。
正确的时区名称
指定 proper time zone name格式为continent/region
,如America/Montreal
, Africa/Casablanca
,或 太平洋/奥克兰
。
在 PDT
之前,这些时区中的任何一个以及更多时区都可能是:
ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
ZoneId z = ZoneId.of( "America/Tijuana" ) ;
ZoneId z = ZoneId.of( "America/Whitehorse" ) ;
但是 PDT
可能并不表示这个区域,因为亚利桑那州不参与夏令时 (DST) 废话,而中间的 D
表示 DST。
ZoneId z = ZoneId.of( "America/Phoenix" ) ;
避免遗留日期时间类
避免 SimpleTimeFormat
类,因为它是麻烦的旧日期时间类的一部分,这些类现在已成为遗留问题,已被 java.time 类取代。使用 DateTimeFormatter
相反。
同时避免使用 TimeZone
。替换为 ZoneId
.
传递ZoneId
,不是字符串
Someone invokes my API passing in "PDT" as the timezone.
更改您的 API,将 ZoneId
作为参数,而不仅仅是一个字符串。这可确保有效值并为您提供 type-safety .
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .
Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。
您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.*
类。 Hibernate 5 和 JPA 2.2 支持 java.time。
从哪里获取 java.time 类?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , 以及后来的 - 标准 Java API 的一部分,带有捆绑实现。
- Java 9带来了一些次要功能和修复。
- Java SE 6和 Java SE 7
- 在 ThreeTen-Backport 中,大部分 java.time 功能都向后移植到 Java 6 和 7。 .
- Android
- 更高版本的 Android(26+)捆绑了 java.time 类的实现。
- 对于早期的 Android (<26),进程 API desugaring带来一个subset of the java.time Android 最初未内置的功能。
- 如果脱糖没有提供您需要的东西,ThreeTenABP项目改编ThreeTen-Backport (上面提到的)Android。参见 How to use ThreeTenABP… .
关于Java TimeZone.getTimeZone ("PDT")不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31151764/