Shifted Java Date已成为过去

时间:2012-04-18 09:42:51

标签: java date time shift

我有一个我无法理解的问题 - 如果我添加超过24天,过去的转移日期。

long start = System.currentTimeMillis();
long shift = 3600000 * 24 * 24;
System.out.println(new Date(start));
System.out.println(new Date(start + shift));

24天轮班:

start - Wed Apr 18 11:37:12 CEST 2012
end - Sat May 12 11:37:12 CEST 2012

25天轮班:

start - Wed Apr 18 11:37:55 CEST 2012
end - Sat Mar 24 17:35:08 CET 2012

有人可以告诉我为什么它会这样吗?谢谢。

3 个答案:

答案 0 :(得分:4)

你正在进行整数乘法,然后将结果转换为long。乘法溢出,因此结果为负。

使用以下代码进行长乘法运算:

long shift = 3600000L * 24 * 24;

答案 1 :(得分:0)

我真的建议不要这样解决你的问题;请改用java.util.Calendar。它更有可能应对像夏令时变化这样的角落案例,而且API更好。

Calendar cal = Calendar.getInstance();
cal.setTime(new Date(start));
cal.add(Calendar.DAY_OF_MONTH, 24)
Date shifted = cal.getTime();

答案 2 :(得分:0)

也许你应该只使用java.util.Calendar,如下所示:

Calendar c = GregorianCalendar.getInstance(); //time default to now
c.add(Calendar.DATE, 24); //adds 24 days
Date end = c.getTime();