1. 程式人生 > >Calendar的get()、set()和roll()方法注意事項

Calendar的get()、set()和roll()方法注意事項

轉載:http://blog.sina.com.cn/s/blog_677873910102vcp7.html

示例程式碼: Calendar c = Calendar.getInstance();   c.set(2014, Calendar.MARCH, 31); c.add(Calendar.MONTH, 13); System.out.println(c.getTime()); // 2015-04-30
  c.set(2014, Calendar.MARCH, 31); c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 13);
System.out.println(c.getTime()); // 2015-05-01
  c.set(2014, Calendar.MARCH, 31); c.roll(Calendar.MONTH, 13); System.out.println(c.getTime()); //2014-04-30
ADD方法     以調整的單位為基點(本例中為月), 較大的單位(年)會發生借位、進位。 較小的單位會往小調整。     本例中, 2014-03-31,加上13個月,年份會進位為2015年。 4月31日是不存在的,所以往小調整為4月30日。
    比較典型的運用場景是,日曆的按月切換。     當前日期為2014-03-31,點選【下一月】按鈕時,日期會變成2014-04-30.
SET方法      所有的單位都會往大調整。     本例中, 2014-03-31,加上13個月,年份會進位為2015年。 4月31日是不存在的,所以往大調整為5月1日
ROLL方法     以調整的單位為基點(本例中為月), 較大的單位(年)不會發生改變。 較小的單位會往小調整。
      本例中, 2014-03-31,加上13個月,年份依然為2014年。 4月31日是不存在的,所以往小調整為4月30日。     日會根據年、月來判斷出日的取值範圍,然後在1~31之間無限迴圈滾動,但並不會影響到年、月的值。
總結三點:  1、add() 有兩條規則:  a)當被修改的欄位超出它的 取值範圍時,那麼比它大的欄位會自動修正。  b)如果比它小的欄位是不可變的/不在取值範圍內(由 Calendar 的實現類決定),那麼該小欄位會修正到變化最小的值。  2、Roll() 的規則只有第二條   當被修改的欄位超出它的取值範圍時,那麼比它大的欄位不會被修正。比它小 的欄位會修正到變化最小的值。  3、Set()   比被修改的欄位大的欄位會根據欄位是增大還是減小自動改變大小,比被修改欄位小的欄位如果 是不可變的/不在取值範圍內,會自動增大到變化最小的值。