先上代码为敬:
package com.jack.demo;
import java.util.Calendar;
public class Demo3 {
public static void main(String args[]){
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
Calendar c3 = Calendar.getInstance();
c1.set(2018, Calendar.MARCH, 31);//2018.3.31
c1.add(Calendar.MONTH, 11);
System.out.println(c1.getTime());
// 2019.2.28
c2.set(2018, Calendar.MARCH, 31);//2018.3.31
c2.set(Calendar.MONTH, c2.get(Calendar.MONTH) + 11);
System.out.println(c2.getTime());
//2020.3.3
c3.set(2018, Calendar.MARCH, 31);//2018.3.31
c3.roll(Calendar.MONTH, 11);
System.out.println(c3.getTime());
//2018.2.28
}
}
仔细观察上面调用三个方法后的输出结果。。是不是不懂,不懂就对了,且我慢慢娓娓道来…
首先知道基准点,就是我在操作哪个参数,哪个参数就是基准点。。
add方法
- 以调整的单位为基点(本例中为月),较大的单位(年)会发生进位。 较小的单位会往小调整。
- 本例中,2018-03-31,加上11个月,年份会进位为2019年。 2月31日是不存在的,所以往小调整为2月28日。
- 比较典型的运用场景是,日历的按月切换。 当前日期为2019-01-31,点击【下一月】按钮时,日期会变成2019-02-28。
set方法
- 所有的单位都会往大调整。
- 本例中,2018-03-31,加上11个月,年份会进位为2019年。 2月31日是不存在的,所以往大调整为3月3日。
roll方法
- 以调整的单位为基点(本例中为月),较大的单位(年)不会发生改变。 较小的单位会往小调整。
- 本例中,2018-03-31,加上11个月,年份依然为2018年。 2月31日是不存在的,所以往小调整为2月28日。
- 日会根据年、月来判断出日的取值范围,然后在1~31之间无限循环滚动,但并不会影响到年、月的值。
总结:
add() 规则:
- 当被修改的字段(基准点)超出它的取值范围时,那么比它大的字段会自动修正。
- 如果比它小的字段不在取值范围内(由 Calendar 的实现类决定),那么该小字段会修正到变化最小的值。
set()规则
- 比被修改的字段(基准点)大的字段会根据字段是增大还是减小自动改变大小,比被修改字段小的字段如果不在取值范围内,会自动增大到变化最小的值。
roll() 规则
- 当被修改的字段(基准点)超出它的取值范围时,那么比它大的字段不会被修正。比它小的字段会修正到变化最小的值。