【发布时间】:2016-07-16 03:42:26
【问题描述】:
如果日历在当月的最后一天(比如 7 月 31 日),将
c.add(Calendar.DAY_OF_MONTH, 1);
将 c 设置为同月的开始,即 7 月,还是将 c 提前到下个月的 8 月?
【问题讨论】:
标签: java android wear-os android-calendar watchface
如果日历在当月的最后一天(比如 7 月 31 日),将
c.add(Calendar.DAY_OF_MONTH, 1);
将 c 设置为同月的开始,即 7 月,还是将 c 提前到下个月的 8 月?
【问题讨论】:
标签: java android wear-os android-calendar watchface
查看超类 java.util.Calendar 的文档,在名为“Field Manipulation”的部分(强调我的):
add(f, delta)将delta添加到字段f。这相当于调用set(f, get(f) + delta)进行两次调整:添加规则 1。调用后字段
f的值减去调用前字段f的值是delta,以字段f中发生的任何溢出为模。 溢出在字段值超出其范围时发生,因此,下一个较大的字段会增加或减少,并且字段值会调整回其范围内。 p>
所以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
【讨论】: