1

对于以下代码段

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(即一月),现在月份应该是 2009 年 1 月。但它是 2010 年 1 月。

那么,在这种情况下,set 和 add 有什么区别呢?

4

3 回答 3

1

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

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

另见:

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

于 2012-10-22T05:46:11.377 回答
0

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

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

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

将返回月份为一月

于 2012-10-22T06:36:48.673 回答
0

set当月份比十二月多一时,似乎实际上是在增加年份:

在下面的

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

a.get(Calendar.MONTH)是 12 月,当您在其上添加 1 并将结果设置为日历对象时,它在逻辑上实际上是明年的 1 月,因此在这种情况下也可以更改 year 的值。

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

您可以查看以下代码:

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());

输出是:

2009 年 12 月 10 日星期四 00:00:00 CST
2010 年 1 月 10 日星期日 00:00:00 CST
2010 年 6 月 10 日星期四 00:00:00 CDT
2012 年 1 月 10 日星期二 00:00:00 CST
2011 年 10 月 10 日星期一 00:00:00 CDT

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

于 2012-10-22T06:41:53.713 回答