从今天起计算过去日期的Java将进入未来

Abu*_*ish 5 java datetime

我在Java中计算当前日期减去一定天数的问题.

我有:

Date pastDate = new Date(new Date().getTime() - (1000 * 60 * 60 * 24 * 25));
Run Code Online (Sandbox Code Playgroud)

这是返回2016年2月16日星期二09:04:18它应该实际返回Tue Dec 28 16:06:11 2015年(过去25天).

非常奇怪的是,对于25天以下的任何数字,完全没问题:

Date pastDate = new Date(new Date().getTime() - (1000 * 60 * 60 * 24 * 24));
Run Code Online (Sandbox Code Playgroud)

在过去的24天内返回可预测的Tue Dec 29 16:06:11 2015年.

任何帮助,将不胜感激.

rge*_*man 10

随着24时间的推移,产品仍然低于最大可能intInteger.MAX_VALUE,即2,147,483,647.该24天的产品是2073600000.该25天的产品是21.6.结果是溢出和负数,导致将来的日期.

对于此类值,请使用long文字作为第一个值(或将其转换为a long)以避免超出时出现的溢出Integer.MAX_VALUE.请注意L附加到1000L:

(1000L * 60 * 60 * 24 * 25)
Run Code Online (Sandbox Code Playgroud)

这工作正常,因为所需的构造函数Date取一个long.

使用Calendars可以更清晰地处理日期算术,您可以明确地add使用负数天.

此外,使用Java 8+,您可以使用Instant及其minus方法来减去时间.

Instant.now().minus(24, ChronoUnit.DAYS);
Run Code Online (Sandbox Code Playgroud)