在玩Calendar
和TimeZone
时,我遇到了以下奇怪的行为。
Calendar pstCal = Calendar.getInstance(TimeZone.getTimeZone("PST"));
System.out.println("H: "+ pstCal.get(Calendar.HOUR));
在写这篇文章的那一刻,根据http://www.timeanddate.com/time/zones/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中也看到了这种情况
From javadoc:
三个字母的时区id
与JDK 1.1兼容。x时,还支持其他三个字母的时区id(如"PST", "CTT", "AST")。然而,不推荐使用,因为相同的缩写通常用于多个时区(例如,"CST"可能是美国"中央标准时间"。和"中国标准时间"),Java平台只能识别其中一个。
具体来说,Java可能已经决定了相当于"美国/洛杉矶";在过去,这意味着夏令时在PST和PDT之间交替进行。他们可能对"est"有不同的看法;不管出于什么原因。
作为时区标识符,缩写是不好的。您仍然可以在显示值中发现它们的常用用法,包括timeanddate.com上的缩写。但这并不意味着它们被Java以相同的方式解释。
如果你真的想知道为什么"EST"one_answers";PST"在被Java解释为时区id时,对夏令时的不同处理,请考虑"EST"、"MST"one_answers"HST"由于POSIX向后兼容性的原因,仍然在tzdb源数据中作为固定偏移时区。"PST"one_answers";CST"不再在tzdb中列出,因此Java通过一些其他硬编码映射来解释它们,以实现它们自己与Java 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());
返回-
东部标准时间false
太平洋标准时间true