1. add() 与 roll() 的区别
add() 的功能非常强大,add 可以对 Calendar 的字段进行计算。如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。
add() 有两条规则:
当被修改的字段超出它可以的范围时,那么比它大的字段会自动修正。如:
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31
cal1.add(Calendar.MONTH, 1); //2000-9-31 => 2000-10-1,对吗?
System.out.println(cal1.getTime()); //结果是 2000-9-30
另一个规则是,如果比它小的字段是不可变的(由 Calendar 的实现类决定),那么该小字段会修正到变化最小的值。
以上面的例子,9-31 就会变成 9-30,因为变化最小。
Roll() 的规则只有一条:
当被修改的字段超出它可以的范围时,那么比它大的字段不会被修正。如:
Calendar cal1 = Calendar.getInstance();
cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日
cal1.roll(Calendar.WEEK_OF_MONTH, -1); //1999-6-1, 周二
cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日
cal1.add(Calendar.WEEK_OF_MONTH, -1); //1999-5-30, 周日
WEEK_OF_MONTH 比 MONTH 字段小,所以 roll 不能修正 MONTH 字段。
2.DAY_OF_WEEK_IN_MONTH
public static final int DAY_OF_WEEK_IN_MONTH
-
get
和set
的字段数字,指示当前月中的第几个星期。与DAY_OF_WEEK
字段一起使用时,就可以惟一地指定某月中的某一天。与WEEK_OF_MONTH
和WEEK_OF_YEAR
不同,该字段的值并 不 取决于getFirstDayOfWeek()
或getMinimalDaysInFirstWeek()
。DAY_OF_MONTH
1 到7
总是对应于DAY_OF_WEEK_IN_MONTH 1
;8
到14
总是对应于DAY_OF_WEEK_IN_MONTH 2
,依此类推。DAY_OF_WEEK_IN_MONTH 0
表示DAY_OF_WEEK_IN_MONTH 1
之前的那个星期。负值是从一个月的末尾开始反向计数,因此,一个月的最后一个星期天被指定为DAY_OF_WEEK = SUNDAY, DAY_OF_WEEK_IN_MONTH = -1
。因为负值是反向计数的,所以它们在月份中的对齐方式通常与正值的不同。例如,如果一个月有 31 天,那么DAY_OF_WEEK_IN_MONTH -1
将与DAY_OF_WEEK_IN_MONTH 5
和DAY_OF_WEEK_IN_MONTH 4
的末尾相重叠。