如果日历在当月的最后一天(比如 7 月 31 日),将
c.add(Calendar.DAY_OF_MONTH, 1);
将 c 设置为同月的开始,即 7 月,还是将 c 提前到下个月的 8 月?
如果日历在当月的最后一天(比如 7 月 31 日),将
c.add(Calendar.DAY_OF_MONTH, 1);
将 c 设置为同月的开始,即 7 月,还是将 c 提前到下个月的 8 月?
查看超类的文档java.util.Calendar
,在名为“字段操作”的部分(强调我的):
add(f, delta)
添加delta
到字段f
。这相当于调用set(f, get(f) + delta)
了两个调整:添加规则 1。调用后field
f
的值减去调用f
前field 的值,以 fielddelta
中发生的任何溢出为模f
。当字段值超出其范围时会发生溢出,因此,下一个较大的字段会递增或递减,并且字段值会调整回其范围内。
因此add(Calendar.DAY_OF_MONTH, 1)
将 7 月 31 日更改为 8 月 1 日。
相反,文档继续:
roll(f, delta)
添加delta
到字段f
而不更改更大的字段。这相当于add(f, delta)
通过以下调整调用:滚动规则。调用后较大的字段保持不变。较大的字段表示较大的时间单位。
DAY_OF_MONTH
是一个比 更大的场HOUR
。
因此roll(Calendar.DAY_OF_MONTH, 1)
将 7 月 31 日更改为 7 月1 日。
Calendar 对象中的月份从 0 开始。所以 1 表示二月。你知道 2 月的最后一天是 28 日,所以输出应该是 3 月 2 日。
0 = January = Calendar.JANUARY
1 = february = Calendar.FEBRUARY
所以
Calendar calendar = new GregorianCalendar();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // Jan = 0, not 1