Java 新日期(new Date().getTime()-25*24*60*60*1000)获取了意外的日期
我想生成一个日期列表,但发现日期错误,从-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开始是错误的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
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或通过将24along
作为
Date dt = new Date(new Date().getTime() - i * 24L * 60 * 60 * 1000);
// ---------------------------------------------^
为什么xxx工作而yyy不工作
因为您已经将乘法分解为两部分(为了清晰起见,我在其中添加了一个空格,因为-1
看起来像负数,而不是紧跟在1
后面的减法运算符):
…您将其拆分为的两个部分都没有溢出int
的范围
一般来说,我不建议以这种方式处理日期,尤其是因为不是所有的日子都有24小时(考虑进入和退出夏令时的日子)。我会使用一个允许您在“天”级别工作的库,例如Java 8Java.time
stuff或JodaTime,或类似的。整数溢出
相乘25*24*60*60*1000
会得到216000000
,这比整数中的数值要大。java.time
更容易在上使用
LocalDate today=LocalDate.now();//最好传递可选的'ZoneId'。
对于(int i=0;iIs thisjava.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() );
…
}