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

时间:2015-09-17 09:41:01

标签: java calendar timezone

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

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

在写这篇文章的那一刻,根据http://www.timeanddate.com/time/zones/pst的PST时间是凌晨1:39。但是,上面显示的代码会产生输出“ 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上。

2 个答案:

答案 0 :(得分:3)

来自the javadoc

  

三个字母的时区ID

     

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

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

作为时区标识符,缩写并不好。您仍会在 display 值中找到它们,包括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。

答案 1 :(得分:1)

Kousalik,首先,短名称并不是识别时区的好方法,因为它并不是唯一的;此外,如果在EST时区对象上调用useDaylightTime(),则它将返回false,而当您在PST时区对象上调用useDaylightTime()时,它将返回true。 由此可以肯定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());

退货 -

东部标准时间错误

太平洋标准时间为真