Java Calendar API的输出错误

kan*_*rbk 1 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());
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

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
Run Code Online (Sandbox Code Playgroud)

在"5月31日"之后,它将是"5月30日,5月29日,5月28日和5月27日",但它返回错误的日期.

    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
Run Code Online (Sandbox Code Playgroud)

这个错误在Calendar.getTime()吗?

Jes*_*per 8

不,这不是一个错误Calendar.getTime().

你正在使用int,当数字变得太大而无法适应时int,那么i * oneDay溢出就会得到奇怪的结果.

解决方案:long改为使用:

final long oneDay = 24L * 60 * 60 * 1000;
Run Code Online (Sandbox Code Playgroud)

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