从java日期减去毫秒数会产生意外结果

时间:2018-04-12 19:15:05

标签: java

我需要从java.util.Date对象中减去几个月的时间来获取不同的java.util.Date。我知道在java 8中有一种简单的方法可以做到这一点,但是这必须在我学校的不支持java 8的服务器上运行。我当前的解决方案如下所示:

int numDaysToSubtract = 60;
Date curDate = new Date();

//subtract numdays * hours/day * mins/hour * secs/min * millisecs/sec
Date newDate = new Date(curDate.getTime() - (numDaysToSubtract * 24 * 3600 * 1000));

curDate是4/12/2018,计算的新日期是4/2/2018,显然不是2014年4月12日之前的60天。

为什么这不按预期工作?

我该怎么办呢?

1 个答案:

答案 0 :(得分:3)

你已经溢出了要减去的毫秒数,因为该产品不适合32位整数,其最大值约为21亿(10位)。

60天的毫秒数是5,184,000,000,超过极限。由于溢出,产品计算为889,032,704毫秒,或大约10.2天。

numDaysToSubtract强制转换为long,或者将其声明为long,以强制进行long计算,避免溢出。对我来说,这样做的结果是在2018年2月11日,60天前。