尴尬的 Java 日期创建行为



当我尝试创建两个日期时,我刚刚遇到了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 日以来的毫秒数不会改变,但它表示的时间基于时区。

相关内容

  • 没有找到相关文章

最新更新