Calendar的add()、set()和roll()使用方法和规则详解

先上代码为敬:

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方法

  1. 以调整的单位为基点(本例中为月),较大的单位(年)会发生进位。 较小的单位会往小调整。
  2. 本例中,2018-03-31,加上11个月,年份会进位为2019年。 2月31日是不存在的,所以往小调整为2月28日。
  3. 比较典型的运用场景是,日历的按月切换。 当前日期为2019-01-31,点击【下一月】按钮时,日期会变成2019-02-28。

set方法

  1. 所有的单位都会往大调整。
  2. 本例中,2018-03-31,加上11个月,年份会进位为2019年。 2月31日是不存在的,所以往大调整为3月3日。

roll方法

  1. 以调整的单位为基点(本例中为月),较大的单位(年)不会发生改变。 较小的单位会往小调整。
  2. 本例中,2018-03-31,加上11个月,年份依然为2018年。 2月31日是不存在的,所以往小调整为2月28日。
  3. 日会根据年、月来判断出日的取值范围,然后在1~31之间无限循环滚动,但并不会影响到年、月的值。

总结:

add() 规则:

  • 当被修改的字段(基准点)超出它的取值范围时,那么比它大的字段会自动修正。
  • 如果比它小的字段不在取值范围内(由 Calendar 的实现类决定),那么该小字段会修正到变化最小的值。

set()规则

  • 比被修改的字段(基准点)大的字段会根据字段是增大还是减小自动改变大小,比被修改字段小的字段如果不在取值范围内,会自动增大到变化最小的值。

roll() 规则

  • 当被修改的字段(基准点)超出它的取值范围时,那么比它大的字段不会被修正。比它小的字段会修正到变化最小的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章