玩Calendar
和TimeZone
我遇到了以下奇怪的行为。
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上。
答案 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());
退货 -
东部标准时间错误
太平洋标准时间为真