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() 規則

  • 當被修改的字段(基準點)超出它的取值範圍時,那麼比它大的字段不會被修正。比它小的字段會修正到變化最小的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章