先上代碼爲敬:
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() 規則
- 當被修改的字段(基準點)超出它的取值範圍時,那麼比它大的字段不會被修正。比它小的字段會修正到變化最小的值。