Calendar向后滚动(roll)3个小时,输出不正确

[code="java"]
Calendar c1 = Calendar.getInstance();
c1.set(2009, 11, 1, 11, 20, 43);
System.out.println(String.format("%tF %<tT", c1));
c1.roll(Calendar.HOUR, 3);

System.out.println(String.format("%tF %<tT", c1));
Calendar c2 = Calendar.getInstance();
c2.set(2009, 11, 1, 14, 20, 43);
System.out.println(String.format("%tF %<tT", c2));
[/code]

输出结果为:
2009-12-01 11:20:43
2009-12-01 02:20:43
2009-12-01 14:20:43

为什么第二个结果是 02:20:43,而不是想象中的 14:20:43 呢?

roll()可能只针对12小时制,add()是24小时制,你把它改成add方法就可以正常显示。

public abstract void add(int field, int amount)
根据日历的规则,为给定的日历字段添加或减去指定的时间量。

public abstract void roll(int field, boolean up)
在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。

或者public abstract void roll(int field, int amount)
向指定日历字段添加指定(有符号的)时间量,不更改更大的字段。

注:Calendar 上的此方法的默认实现只是重复地调用滚动一个单元roll(int field, boolean up)的版本。

两者的区别:
roll()方法只影响指定域,如果指定月份,从一月份向下滚动,将会是同年的十二月份,而年份不会改变,因为roll()不更改更大的字段。

add()方法不仅更改指定域,而且会根据需要调整Calendar的其他域,如果指定月份,从一月份向下增加,年份也会相应的增加。

平时一般都用add() 自动调整的 roll()总是在一年中滚动

对 最关键忘记说了 roll()的确是12进制的