新日期(新日期()。getTime() - 25 * 24 * 60 * 60 * 1000)有意想不到的日期

时间:2016-07-17 10:28:21

标签: 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

我不知道2016-08-11来自哪里。我分解了25到24和-1,如下所示(xxxyyy),然后我得到了正确的日期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));
}

3 个答案:

答案 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)

java.time

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() );
    …
}

后端移植到Android

大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。