当我尝试创建两个日期时,我刚刚遇到了Java的Date类的一个非常奇怪的行为:
Date startDate = new Date(1282863600000L);
System.out.println(startDate);
Date endDate = new Date(1321919999000L);
System.out.println(endDate);
输出分别为:
2010年8月27日星期五 00:00:00 BST2011年11月21日星期一 23:59:59 GMT
有人见过这样的东西吗?两个日期都以相同的方式初始化,但是打印时,第一个以BST显示,后者以GMT显示?
我试图找到对此的解释,但我没有。有人可以帮助我吗?
提前感谢!
记录在案的行为。
从Date.toString()
:
将此 Date 对象转换为以下格式的字符串:
dow mon dd hh:mm:ss zzz yyyy
zzz
是时区(可能反映夏令时(。标准时区缩写包括方法解析识别的缩写。如果时区信息不可用,则zzz
为空 - 也就是说,它根本不包含任何字符。
您正在使用使用英国夏令时的区域设置,并创建应用夏令时规则的日期。这将是本地用户当时的预期日期形式。
,这段代码的输出是
2010年8月27日星期五 01:00:00 CEST2011年11月22日星期二 00:59:59 CET
确切的结果取决于 Java 在系统上使用的默认语言环境。
不同之处在于 CEST 是中欧夏令时,而 CET 是中欧夏令时(即不是夏令时(。
您似乎在英国区域设置(en_GB
或类似区域设置(中运行,因此您的输出分别显示英国夏令时和格林威治标准时间。
您指定的第一个日期属于相应的夏令时,第二个日期则不属于。因此,Java 为每个区域设置/时间组合选择合适的时区。
经过一次可爱的尝试不同的long
值后,我得到了这个:
Date startDate1 = new Date(1284245999999L);
Date startDate2 = new Date(1284246000000L);
System.out.println(startDate1);
System.out.println(startDate2);
Date endDate = new Date(1321919999000L);
System.out.println(endDate);
输出为:
Sun Sep 12 01:59:59 IDT 2010
Sun Sep 12 01:00:00 IST 2010 <-- Long value is greater, but due to DST changes, actual time is one hour earlier
Tue Nov 22 01:59:59 IST 2011
请注意,将 long 从 1284245999999L
增加到 1284246000000L
1
会使我们"回到过去",因为从标准时间过渡到夏令时。
这就是 Java 时间计算的行为方式 - 自 1970 年 1 月 1 日以来的毫秒数不会改变,但它表示的时间基于时区。