Calendar的get()、set()和roll()方法注意事項
阿新 • • 發佈:2018-11-03
轉載: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() 比被修改的欄位大的欄位會根據欄位是增大還是減小自動改變大小,比被修改欄位小的欄位如果 是不可變的/不在取值範圍內,會自動增大到變化最小的值。
c.set(2014, Calendar.MARCH, 31); c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 13);
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日。
SET方法 所有的單位都會往大調整。 本例中, 2014-03-31,加上13個月,年份會進位為2015年。 4月31日是不存在的,所以往大調整為5月1日
ROLL方法 以調整的單位為基點(本例中為月), 較大的單位(年)不會發生改變。 較小的單位會往小調整。
總結三點: 1、add() 有兩條規則: a)當被修改的欄位超出它的 取值範圍時,那麼比它大的欄位會自動修正。 b)如果比它小的欄位是不可變的/不在取值範圍內(由 Calendar 的實現類決定),那麼該小欄位會修正到變化最小的值。 2、Roll() 的規則只有第二條 當被修改的欄位超出它的取值範圍時,那麼比它大的欄位不會被修正。比它小 的欄位會修正到變化最小的值。 3、Set() 比被修改的欄位大的欄位會根據欄位是增大還是減小自動改變大小,比被修改欄位小的欄位如果 是不可變的/不在取值範圍內,會自動增大到變化最小的值。