4

这是我的代码片段。我需要从某个日期减去天数,但我没有得到我期望的结果:

public class TestingDates {

    public static void main(String[] args) {
        Date toDate=new Date();
        Date fromDate=new Date();
        for (int i = 0; i < 30; i++) {
            fromDate.setTime(toDate.getTime() - i * 24 * 60 * 60 * 1000);
            System.out.println(fromDate);   
        }
    }
}

我对这个结果感到困惑

这是输出

Fri Sep 13 12:24:50 IST 2013
Thu Sep 12 12:24:50 IST 2013
Wed Sep 11 12:24:50 IST 2013
Tue Sep 10 12:24:50 IST 2013
Mon Sep 09 12:24:50 IST 2013
Sun Sep 08 12:24:50 IST 2013
Sat Sep 07 12:24:50 IST 2013
Fri Sep 06 12:24:50 IST 2013
Thu Sep 05 12:24:50 IST 2013
Wed Sep 04 12:24:50 IST 2013
Tue Sep 03 12:24:50 IST 2013
Mon Sep 02 12:24:50 IST 2013
Sun Sep 01 12:24:50 IST 2013
Sat Aug 31 12:24:50 IST 2013
Fri Aug 30 12:24:50 IST 2013
Thu Aug 29 12:24:50 IST 2013
Wed Aug 28 12:24:50 IST 2013
Tue Aug 27 12:24:50 IST 2013
Mon Aug 26 12:24:50 IST 2013
Sun Aug 25 12:24:50 IST 2013
Sat Aug 24 12:24:50 IST 2013
Fri Aug 23 12:24:50 IST 2013
Thu Aug 22 12:24:50 IST 2013
Wed Aug 21 12:24:50 IST 2013
Tue Aug 20 12:24:50 IST 2013
Tue Oct 08 05:27:38 IST 2013
Mon Oct 07 05:27:38 IST 2013
Sun Oct 06 05:27:38 IST 2013
Sat Oct 05 05:27:38 IST 2013
Fri Oct 04 05:27:38 IST 2013

请帮我解决这个问题

4

4 回答 4

12

您似乎想向后计算 30 天...您应该尝试Calendar改用

Calendar cal = Calendar.getInstance();
cal.setTime(toDate);
for (int i = 0; i < 30; i++) {
    cal.add(Calendar.DATE, -1);
    System.out.println(cal.getTime());
}
于 2013-09-13T07:34:05.883 回答
9

你面临整数溢出。您的 int 变量的最大值i2^31-1

对变量使用 long 类型i以避免溢出。

    for (long i = 0; i < 30; i++) {
        fromDate.setTime(toDate.getTime() - i * 24 * 60 * 60 * 1000);
        System.out.println(fromDate);   
    }
于 2013-09-13T07:32:48.513 回答
3

您的计算溢出

    public static void main(String[] args) {
        Date toDate=new Date();
        Date fromDate=new Date();
        for (int i = 0; i < 30; i++) {
            int x = i * 24 * 60 * 60 * 1000;
            System.out.println(x);
            fromDate.setTime(toDate.getTime() - x);
            System.out.println(fromDate);   
        }
}

结果是

0
Fri Sep 13 09:32:00 CEST 2013
86400000
Thu Sep 12 09:32:00 CEST 2013
172800000
Wed Sep 11 09:32:00 CEST 2013
259200000
Tue Sep 10 09:32:00 CEST 2013
345600000
Mon Sep 09 09:32:00 CEST 2013
432000000
Sun Sep 08 09:32:00 CEST 2013
518400000
Sat Sep 07 09:32:00 CEST 2013
604800000
Fri Sep 06 09:32:00 CEST 2013
691200000
Thu Sep 05 09:32:00 CEST 2013
777600000
Wed Sep 04 09:32:00 CEST 2013
864000000
Tue Sep 03 09:32:00 CEST 2013
950400000
Mon Sep 02 09:32:00 CEST 2013
1036800000
Sun Sep 01 09:32:00 CEST 2013
1123200000
Sat Aug 31 09:32:00 CEST 2013
1209600000
Fri Aug 30 09:32:00 CEST 2013
1296000000
Thu Aug 29 09:32:00 CEST 2013
1382400000
Wed Aug 28 09:32:00 CEST 2013
1468800000
Tue Aug 27 09:32:00 CEST 2013
1555200000
Mon Aug 26 09:32:00 CEST 2013
1641600000
Sun Aug 25 09:32:00 CEST 2013
1728000000
Sat Aug 24 09:32:00 CEST 2013
1814400000
Fri Aug 23 09:32:00 CEST 2013
1900800000
Thu Aug 22 09:32:00 CEST 2013
1987200000
Wed Aug 21 09:32:00 CEST 2013
2073600000
Tue Aug 20 09:32:00 CEST 2013
-2134967296
Tue Oct 08 02:34:48 CEST 2013
-2048567296
Mon Oct 07 02:34:48 CEST 2013
-1962167296
Sun Oct 06 02:34:48 CEST 2013
-1875767296
Sat Oct 05 02:34:48 CEST 2013
-1789367296
Fri Oct 04 02:34:48 CEST 2013

在日期跳转之前查看 x 值。

于 2013-09-13T07:33:57.097 回答
2

尝试打印您在此行之后得到的实际 int :

i * 24 * 60 * 60 * 1000

这是输出:

86400000
172800000
259200000
345600000
432000000
518400000
604800000
691200000
777600000
864000000
950400000
1036800000
1123200000
1209600000
1296000000
1382400000
1468800000
1555200000
1641600000
1728000000
1814400000
1900800000
1987200000
2073600000
-2134967296
-2048567296
-1962167296
-1875767296
-1789367296

如您所见,您创建的数字高于int可存储的数字,因此会溢出。解决方案是使用long64 位数字。

于 2013-09-13T07:35:58.353 回答