Java PST 时区的日历时间错误?

Java Calendar wrong time for PST time zone?

CalendarTimeZone 我遇到了以下奇怪的行为。

Calendar pstCal = Calendar.getInstance(TimeZone.getTimeZone("PST"));
System.out.println("H: "+ pstCal.get(Calendar.HOUR));

在撰写本文时 post,根据 http://www.timeanddate.com/time/zones/pst 的 PST 时间为 1:39am。然而,上面显示的代码会产生输出“H: 2

为什么是 2 而不是 1? 仔细查看 Calendar 实例解释数字 2:dstSavings=3600000,useDaylight=true

但据我所知,PST 代表太平洋标准时间,即没有夏令时的时间。

为什么 Java 这样对待 PST 这是正确的还是 BUG?顺便说一句,EST 没有这个问题 - 这里它对应于 http://www.timeanddate.com/time/zones/est

我在 Oracle JDK 1.8.0_60 和 OpenJDK 1.8.0_60 中也看到了这种情况。

Kousalik,首先短名称不是识别时区的好方法,因为它不是唯一的;此外,如果您在 EST 时区对象上调用 useDaylightTime(),那么它会 return 为假,而当您在 PST 时区对象上调用 useDaylightTime() 时,它会 return 为真。 由此可以肯定 JDK 对两个时区的看法不同。

    TimeZone esttz = TimeZone.getTimeZone("EST");
    System.out.println(esttz.getDisplayName() + " "+esttz.useDaylightTime());

    TimeZone psttz = TimeZone.getTimeZone("PST");
    System.out.println(psttz.getDisplayName() + " "+psttz.useDaylightTime());

Returns -

东部标准时间 false

太平洋标准时间真

来自the javadoc

Three-letter time zone IDs

For compatibility with JDK 1.1.x, some other three-letter time zone IDs (such as "PST", "CTT", "AST") are also supported. However, their use is deprecated because the same abbreviation is often used for multiple time zones (for example, "CST" could be U.S. "Central Standard Time" and "China Standard Time"), and the Java platform can then only recognize one of them.

具体来说,Java 可能决定“PST”在过去等同于“America/Los_Angeles”,这意味着夏令时在 PST 和 PDT 之间交替。他们可能出于某种原因对“EST”做出了不同的决定。

作为时区标识符,缩写是不好的。您仍然会发现它们在 显示 值中常用,包括 timeanddate.com 上的缩写。但这并不意味着它们被 Java.

以相同的方式解释

如果您真的想了解为什么“EST”和“PST”在被 Java 解释为时区 ID 时在夏令时方面的处理方式不同,请考虑“EST”、“ MST”和“HST”are still in the tzdb source data 出于 POSIX 向后兼容性原因的固定偏移时区。 “PST”和“CST”不再列在 tzdb 中,因此 Java 通过一些其他硬编码映射来解释它们,以便它们自己向后兼容 Java 1.1。