Java Calendar API的输出错误

时间:2014-06-24 12:46:29

标签: java calendar

Calendar.setTimeInMillis Calendar.getTime 很奇怪。它返回错误的日期结果。

Java代码

public static void main(String[] args)
{
    Calendar cal = Calendar.getInstance();
    final int oneDay = 24 * 60 * 60 * 1000;

    for(int i=0; i < 30; i++) {
        cal.setTimeInMillis(System.currentTimeMillis() - i * oneDay);
        System.out.println(cal.getTime());
    }

}

输出

Tue Jun 24 17:50:35 IST 2014
Mon Jun 23 17:50:35 IST 2014
Sun Jun 22 17:50:35 IST 2014
Sat Jun 21 17:50:35 IST 2014
Fri Jun 20 17:50:35 IST 2014
Thu Jun 19 17:50:35 IST 2014
Wed Jun 18 17:50:35 IST 2014
Tue Jun 17 17:50:35 IST 2014
Mon Jun 16 17:50:35 IST 2014
Sun Jun 15 17:50:35 IST 2014
Sat Jun 14 17:50:35 IST 2014
Fri Jun 13 17:50:35 IST 2014
Thu Jun 12 17:50:35 IST 2014
Wed Jun 11 17:50:35 IST 2014
Tue Jun 10 17:50:35 IST 2014
Mon Jun 09 17:50:35 IST 2014
Sun Jun 08 17:50:35 IST 2014
Sat Jun 07 17:50:35 IST 2014
Fri Jun 06 17:50:35 IST 2014
Thu Jun 05 17:50:35 IST 2014
Wed Jun 04 17:50:35 IST 2014
Tue Jun 03 17:50:35 IST 2014
Mon Jun 02 17:50:35 IST 2014
Sun Jun 01 17:50:35 IST 2014
Sat May 31 17:50:35 IST 2014
Sat Jul 19 10:53:23 IST 2014
Fri Jul 18 10:53:23 IST 2014
Thu Jul 17 10:53:23 IST 2014
Wed Jul 16 10:53:23 IST 2014
Tue Jul 15 10:53:23 IST 2014

&#34; 5月31日&#34; ,这将是&#34; 5月30日,5月29日,5月28日&amp; 5月27日&#34;但它返回错误的日期。

    Sat May 31 17:50:35 IST 2014
    Sat Jul 19 10:53:23 IST 2014
    Fri Jul 18 10:53:23 IST 2014
    Thu Jul 17 10:53:23 IST 2014
    Wed Jul 16 10:53:23 IST 2014
    Tue Jul 15 10:53:23 IST 2014

这是Calendar.getTime()中的错误吗?

3 个答案:

答案 0 :(得分:8)

不,这不是Calendar.getTime()中的错误。

您正在使用int,当数字太大而无法容纳int时,i * oneDay会溢出,您会得到奇怪的结果。

解决方案:改为使用long

final long oneDay = 24L * 60 * 60 * 1000;

(您的代码也不考虑夏令时,如果您的时区有夏令时,您会看到一小时的转变。)

答案 1 :(得分:2)

您正在执行整数运算并溢出了一个int。 (带符号)int的最大值是2,147,483,647(2 ^ 31-1)。 ONE_DAY有86,400,000毫秒。在第25天,您达到2,160,000,000,这是一个比在int中表示的更大的值,并且您会溢出到负数。

你可以用long来代替整数来解决这个问题。

public static void main(String[] args)
{
    Calendar cal = Calendar.getInstance();
    final long oneDay = 24 * 60 * 60 * 1000;

    for(int i=0; i < 30; i++) {
        cal.setTimeInMillis(System.currentTimeMillis() - i * oneDay);
        System.out.println(cal.getTime());
    }

}

答案 2 :(得分:1)

替换

final int oneDay = 24 * 60 * 60 * 1000;

final long oneDay = 24 * 60 * 60 * 1000;