Java 新日期(new Date().getTime()-25*24*60*60*1000)获取了意外的日期

Java 新日期(new Date().getTime()-25*24*60*60*1000)获取了意外的日期,java,android,Java,Android,我想生成一个日期列表,但发现日期错误,从-25*24*60*60*1000开始 我的本地日期是2016-07-17。我得到 2016-07-17 2016-07-16 2016-07-15 ... 2016-06-23 2016-08-11 这是我的代码:日期从i=25开始是错误的 for (int i=0; i<240;i++) { Date dt = new Date(new Date().getTime() - i * 24 * 60 * 60 * 1000); Lo

我想生成一个日期列表,但发现日期错误,从-25*24*60*60*1000开始

我的本地日期是2016-07-17。我得到

2016-07-17 2016-07-16 2016-07-15 ... 2016-06-23 2016-08-11 这是我的代码:日期从i=25开始是错误的

for (int i=0; i<240;i++) {
    Date dt = new Date(new Date().getTime() - i * 24 * 60 * 60 * 1000);
    Log.e(TAG,Global.sdfDateTime19.format(dt));
}

for(int i=0;i您溢出了
int
i*24*60*60*1000
的范围,产生了一个
int
(然后从
getDate
long
中减去)

i
为24时没有问题,因为结果是207360000,这比
int
的最大正值2147483647小。但是当你达到
i=25
时,你会绕过去(如果你不限制
int
的话,值会是216000000,这太大了)

只需通过将
i
声明为long或通过将24a
long
作为

Date dt = new Date(new Date().getTime() - i * 24L * 60 * 60 * 1000);
// ---------------------------------------------^
为什么xxx工作而yyy不工作

因为您已经将乘法分解为两部分(为了清晰起见,我在其中添加了一个空格,因为
-1
看起来像负数,而不是紧跟在
1
后面的减法运算符):

…您将其拆分为的两个部分都没有溢出
int
的范围


一般来说,我不建议以这种方式处理日期,尤其是因为不是所有的日子都有24小时(考虑进入和退出夏令时的日子)。我会使用一个允许您在“天”级别工作的库,例如Java 8
Java.time
stuff或JodaTime,或类似的。

整数溢出

相乘
25*24*60*60*1000
会得到
216000000
,这比整数中的数值要大。

java.time 更容易在上使用

LocalDate today=LocalDate.now();//最好传递可选的'ZoneId'。

对于(int i=0;iIs this
java.sql.Date
?这是正确的答案-但我建议使用库(如threetenabp)进行此类计算。这太棒了。非常感谢!我真的需要了解更多java。
Date dt = new Date(new Date().getTime() - i * 24L * 60 * 60 * 1000);
// ---------------------------------------------^
Date xxx = new Date(new Date().getTime()-24 * 24 * 60 * 60 * 1000 - 1 * 24 * 60 * 60 * 1000);
// The first part -----------------------^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^
// The second part ------------------------------------------------/
LocalDate today = LocalDate.now(); // Better to pass the optional `ZoneId`.
for (int i=0; i<240; i++) {
    LocalDate localDate = today.minusDays( i );
    System.out.println( localDate.toString() );
    …
}