new Date(new Date().getTime()-25 * 24 * 60 * 60 * 1000) got unexpected date

后端 未结 3 1243
小鲜肉
小鲜肉 2021-01-21 19:24

I would like to generate a list of dates, but found out the date is wrong start from - 25 * 24 * 60 * 60 * 1000

My local date is 2016-07-17. I got

2016-         


        
相关标签:
3条回答
  • 2021-01-21 19:46

    java.time

    Much easier to use minusDays( 1 ) on 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() );
        …
    }
    

    Back-ported to Android

    Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport and further adapted to Android in ThreeTenABP.

    0 讨论(0)
  • 2021-01-21 19:52

    Integer overflow.

    Multiplying 25 * 24 * 60 * 60 * 1000 results in 2160000000 which is more than what fits in an integer.

    0 讨论(0)
  • 2021-01-21 20:05

    You're overflowing the range of int. i * 24 * 60 * 60 * 1000 yields an int (which is then subtracted from the long from getDate).

    It's okay when i is 24, because the result is 2,073,600,000, which is less than the maximum positive value for an int, 2,147,483,647. But when you reach i = 25, you wrap around (the value if you weren't constrained to int would be 2,160,000,000, which is too big).

    Just make it a long multiplication, either by declaring i as a long or by making the 24 a long:

    Date dt = new Date(new Date().getTime() - i * 24L * 60 * 60 * 1000);
    // ---------------------------------------------^
    

    Why xxx works but yyy not work?

    Because you've broken up the multiplication into two parts (I've added a space in there for clarity, since the -1 otherwise looks like a negative number rather than the subtraction operator followed by 1):

    Date xxx = new Date(new Date().getTime()-24 * 24 * 60 * 60 * 1000 - 1 * 24 * 60 * 60 * 1000);
    // The first part -----------------------^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^
    // The second part ------------------------------------------------/
    

    ... and neither of the two parts you've broken it up into overflows the range of int.


    In general, I wouldn't suggest manipulating dates this way, not least because not all days have exactly 24 hours in them (consider the days going into and out of daylight saving time). I'd use a library that lets you work at the "day" level, such as the Java 8 java.time stuff, or JodaTime, or similar.

    0 讨论(0)
提交回复
热议问题