对于以下代码段
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之间的区别是什么?
答案 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
因此,如果设置的月份值超出范围,则更改年份值。