Java Date类发生了什么?这是一个已知的错误?

时间:2009-06-11 08:09:58

标签: java date

我知道Date大部分已被弃用,但我仍然不时地使用它(代码少于使用Calendar)。我遇到了一个真正奇怪的错误,我想知道是否有人可以向我解释这一点。

此代码在当前时间增加了24天:

long nowL = System.currentTimeMillis();
Date now = new Date(nowL);
System.out.println("now = "+now);
Date future = new Date(nowL+ 24*24*60*60*1000);
System.out.println("future = "+future);

给出了正确的输出:

  

now = Thu Jun 11 10:50:09 IDT 2009

     

future = Sun Jul 05 10:50:09 IDT 2009

虽然此代码增加了25天:

long nowL = System.currentTimeMillis();
Date now = new Date(nowL);
System.out.println("now = "+now);
Date future = new Date(nowL+ 25*24*60*60*1000);
System.out.println("future = "+future);

给出了这个输出:

  

now = Thu Jun 11 10:51:25 IDT 2009

     

future = Sun May 17 17:48:37 IDT 2009

我可以理解几小时甚至几天的差异,但有人可以解释为什么添加太多毫秒导致及时回归?我很困惑。

2 个答案:

答案 0 :(得分:27)

25 * 24 * 60 * 60 * 1000 = 2160000000 = 0x80BEFC00

您正在计算整数值,并获得溢出。如果它是

25 * 24 * 60 * 60 * 1000L

一切都应该没问题。

答案 1 :(得分:5)

这不是Date类中的错误,它是整数溢出的情况。 Java中的int只能在-2 31 和2 31 -1之间,但25×24×60×60×1000大于2 < sup> 31 - 1所以它溢出。

如果你跑

System.out.println(24*24*60*60*1000);
System.out.println(25*24*60*60*1000);

你得到的结果

2073600000
-2134967296

如果您通过向其添加long后缀,将其中一个数字指定为L,则该产品也将是longlong值可以达到2 63 - 1,因此除非您在{{1}添加批次天,否则不会出现溢出}秒。例如,

Date

给你

System.out.println(25L*24*60*60*1000);