我想生成一个日期列表,但发现日期错误从 - 25 * 24 * 60 * 60 * 1000
我的当地日期是2016-07-17。我得到了
2016-07-17 2016-07-16 2016-07-15 ... 2016-06-23 2016-08-11
我不知道2016-08-11
来自哪里。我分解了25到24和-1,如下所示(xxx
和yyy
),然后我得到了正确的日期2016-06-22
。
为什么xxx
有效但yyy
没有?
Date xxx = new Date(new Date().getTime()-24 * 24 * 60 * 60 * 1000 -1 * 24 * 60 * 60 * 1000);
Date yyy = new Date(new Date().getTime()-25 * 24 * 60 * 60 * 1000);
这是我的代码:日期错误,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));
}
答案 0 :(得分:8)
你的int
范围已经超出范围。 i * 24 * 60 * 60 * 1000
会产生int
(然后会从long
中的getDate
中扣除。
i
为24时没关系,因为结果为2,073,600,000,小于int
的最大正值2,147,483,647。但是当你到达i = 25
时,你就会回头(如果不受int
约束,那么该值将是2,160,000,000,这太大了。)
只需将long
声明为i
或将{24}设为long
,即可进行Date dt = new Date(new Date().getTime() - i * 24L * 60 * 60 * 1000);
// ---------------------------------------------^
乘法运算:
-1
为什么xxx有效,但yyy不起作用?
因为你已经将乘法分解为两部分(为了清晰起见,我在那里添加了一个空格,因为1
看起来像一个负数而不是减法运算符后跟{ {1}}):
Date xxx = new Date(new Date().getTime()-24 * 24 * 60 * 60 * 1000 - 1 * 24 * 60 * 60 * 1000);
// The first part -----------------------^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
// The second part ------------------------------------------------/
...而且你把它们分成两部分都没有溢出int
的范围。
一般情况下,我不会建议以这种方式操纵日期,尤其是因为并非所有日子都有24小时(考虑进入和退出夏令时的日子)。我将使用一个允许您在“日”级别工作的库,例如Java 8 java.time
内容,或JodaTime或类似内容。
答案 1 :(得分:2)
整数溢出。
乘以25 * 24 * 60 * 60 * 1000
会导致2160000000
的结果大于整数。
答案 2 :(得分:2)
在minusDays( 1 )
上使用java.time.LocalDate
更容易。
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() );
…
}
大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。