从java日期中减去毫秒会得到意外的结果

从java日期中减去毫秒会得到意外的结果,java,Java,我需要从java.util.Date对象中减去几个月的时间,以获得不同的java.util.Date。我知道在Java8中有一种简单的方法可以做到这一点,但是这必须在我学校不支持Java8的服务器上运行。我当前的解决方案如下所示: int numDaysToSubtract = 60; Date curDate = new Date(); //subtract numdays * hours/day * mins/hour * secs/min * millisecs/sec Date new

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

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));
当前日期为2018年4月12日,计算的新日期为2018年4月2日,这显然不是2018年4月12日之前的60天

为什么这不能像预期的那样工作


我应该尝试什么呢?

由于乘积不适合32位整数,其最大值约为21亿(10位),因此要减去的毫秒数已溢出

60天的毫秒值为5184000000,超过了限制。由于溢出,乘积的计算时间为889032704毫秒,约为10.2天


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

System.out.println(numDaysToSubtract*24*3600*1000)您的问题已得到回答。但仅供参考,以防你不知道:“日期”已经过时(没有双关语)。如果您可以使用Java8+,那么请改为使用“LocalDate”。除其他外,这提供了一种方法:顺便说一句,一天并不总是24小时长。或者通过使
24
成为一个长文本来强制计算
(numDaysToSubtract*24L*3600*1000)
。现在,所有3个乘法都是使用
long
math完成的。@安德烈:当然,这也行。这将迫使第一次乘法将操作数提升为
long
。虽然这里最重要的事情是在溢出发生之前强制升级到
long
,但通常我更希望通过使第一个操作数
变长
来更好地显示从左到右的计算。