GregorianCalendar.set(字段,值+ 1)与GregorianCalendar.add(字段,1)相同

时间:2012-10-22 05:34:16

标签: java gregorian-calendar

对于以下代码段

GregorianCalendar a = new GregorianCalendar(2009, 11, 10);
System.out.println(a.getTime()); // Thu Dec 10 00:00:00 ICT 2009
a.add(Calendar.MONTH, 1);
System.out.println(a.getTime()); // Sun Jan 10 00:00:00 ICT 2010

当我更改此行

a.add(Calendar.MONTH, 1);

进入这一行

a.set(Calendar.MONTH, a.get(Calendar.MONTH) + 1);

返回相同的结果

// Sun Jan 10 00:00:00 ICT 2010

如果是2009年12月,我认为将它设定为月份+ 1(即1月份),这个月现在应该是2009年1月。但是现在是2010年1月。

那么,在这种情况下,set和add之间的区别是什么?

3 个答案:

答案 0 :(得分:1)

Calendar#add(int field, int amount)将日历增加指定的金额。在你的情况下,它增加了一个月。

Calentar#set(int field, int value)将字段设置为指定值,其他字段保持不变。在您的情况下,它将月份设置为1月。

另见:

Calendar#roll(int field, int value)按指定值递增指定字段,但保留较高字段(在您的情况下,年份)不变(2010年10月+ 4个月=&2010年2月)

答案 1 :(得分:0)

如果您已设置默认值,它将为当前日历添加值。(在您的情况下)

如果您想设置月份值,可以在设置日期之前将其设置为如下。

Calendar cal = GregorianCalendar.getInstance(); cal.set(Calendar.MONTH, 0);

将月份作为1月返回

答案 2 :(得分:0)

似乎set实际上是在月份超过12月的一年中递增:

以下

a.set(Calendar.MONTH, a.get(Calendar.MONTH) + 1);

a.get(Calendar.MONTH)是12月,当你在其上加1,并将结果设置为日历对象时,它在逻辑上实际上是下一年的1月,所以更公平地改变年份的值也是这个案例。

否则,日历实例将处于非法状态,月份值无效。

您可以看到以下代码:

Calendar cal = new GregorianCalendar(2009, Calendar.DECEMBER, 10);
System.out.println(cal.getTime());
cal.set(Calendar.MONTH, Calendar.DECEMBER + 1);
System.out.println(cal.getTime());
cal.set(Calendar.MONTH, Calendar.JANUARY + 5);
System.out.println(cal.getTime());
cal.set(Calendar.MONTH, Calendar.DECEMBER + 13);
System.out.println(cal.getTime());
cal.set(Calendar.MONTH, -3);
System.out.println(cal.getTime());

输出结果为:

Thu Dec 10 00:00:00 CST 2009
Sun Jan 10 00:00:00 CST 2010
Thu Jun 10 00:00:00 CDT 2010
Tue Jan 10 00:00:00 CST 2012
Mon Oct 10 00:00:00 CDT 2011

因此,如果设置的月份值超出范围,则更改年份值。