我知道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
我可以理解几小时甚至几天的差异,但有人可以解释为什么添加太多毫秒导致及时回归?我很困惑。
答案 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
,则该产品也将是long
。 long
值可以达到2 63 - 1,因此除非您在{{1}添加批次天,否则不会出现溢出}秒。例如,
Date
给你
System.out.println(25L*24*60*60*1000);