Java GregorianCalendar.set(字段,值+;1)是否与GregorianCalendar.add(字段,1)相同

Java GregorianCalendar.set(字段,值+;1)是否与GregorianCalendar.add(字段,1)相同,java,gregorian-calendar,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.MO

对于以下代码段

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之间有什么区别呢?

按指定的数量递增日历。在你的情况下,它会增加一个月

将字段设置为指定值,其他字段保持不变。在您的情况下,它将月份设置为一月

另见:

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

按指定量递增日历。在你的情况下,它会增加一个月

将字段设置为指定值,其他字段保持不变。在您的情况下,它将月份设置为一月

另见:


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

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

如果要设置月份值,可以在设置日期之前按如下方式进行设置

日历cal=GregorianCalendar.getInstance(); 校准设置(日历月,0)


将返回月份为一月

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

如果要设置月份值,可以在设置日期之前按如下方式进行设置

日历cal=GregorianCalendar.getInstance(); 校准设置(日历月,0)


将返回月份,如一月

似乎
实际上是在该月比十二月多一个月的年份中递增:

在下面

a.set(Calendar.MONTH, a.get(Calendar.MONTH) + 1);
a.get(Calendar.MONTH)
是12月,当您在上面加1,并将结果设置为Calendar对象时,逻辑上它实际上是下一年的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 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中央标准时间 2011年10月10日星期一00:00:00加拿大东部时间
因此,如果设置的月份的值超出范围,则年份的值将发生更改。

似乎
set
实际上是在月份比12月多一个月份时增加年份:

在下面

a.set(Calendar.MONTH, a.get(Calendar.MONTH) + 1);
a.get(Calendar.MONTH)
是12月,当您在上面加1,并将结果设置为Calendar对象时,逻辑上它实际上是下一年的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 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中央标准时间 2011年10月10日星期一00:00:00加拿大东部时间 因此,如果设置的月份的值超出范围,则年的值将更改