Calendar類點點滴滴積累

set(f, value) 將日曆字段 f 更改成 value。此外,它設置了一個內部成員變量,以指示日曆字段 f 已經被更改。儘管日曆字段 f 是當即更改的,可是直到下次調用 get()、getTime()、getTimeInMillis()、add() 或 roll() 時纔會從新計算日曆的時間值(以毫秒爲單位)。所以,屢次調用 set() 不會觸發屢次沒必要要的計算。使用 set() 更改日曆字段的結果是,其餘日曆字段也可能發生更改,這取決於日曆字段、日曆字段值和日曆系統。此外,在從新計算日曆字段以後,get(f) 不必經過調用 set 方法返回 value 集合。具體細節是經過具體的日曆類肯定的。 示例:假定 GregorianCalendar 最初被設置爲 1999 年 8 月 31 日。調用 set(Calendar.MONTH, Calendar.SEPTEMBER) 將該日期設置爲 1999 年 9 月 31 日。若是隨後調用 getTime(),那麼這是解析 1999 年 10 月 1 日的一個暫時內部表示。可是,在調用 getTime() 以前調用 set(Calendar.DAY_OF_MONTH, 30) 會將該日期設置爲 1999 年 9 月 30 日,由於在調用 set() 以後沒有發生從新計算。//set不會當即從新計算日曆的毫秒偏移量和其它全部字段 add(f, delta) 將 delta 添加到 f 字段中。這等同於調用 set(f, get(f) + delta),但要帶如下兩個調整: Add 規則 1。調用後 f 字段的值減去調用前 f 字段的值等於 delta,以字段 f 中發生的任何溢出爲模。溢出發生在字段值超出其範圍時,結果,下一個更大的字段會遞增或遞減,並將字段值調整回其範圍內。 Add 規則 2。若是指望某一個更小的字段是不變的,但讓它等於之前的值是不可能的,由於在字段 f 發生更改以後,或者在出現其餘約束以後,好比時區偏移量發生更改,它的最大值和最小值也在發生更改,而後它的值被調整爲儘可能接近於所指望的值。更小的字段表示一個更小的時間單元。HOUR 是一個比 DAY_OF_MONTH 小的字段。對於不指望是不變字段的更小字段,無需進行任何調整。日曆系統會肯定指望不變的那些字段。 此外,與 set() 不一樣,add() 強迫日曆系統當即從新計算日曆的毫秒數和全部字段!!!!! 示例:假定 GregorianCalendar 最初被設置爲 1999 年 8 月 31 日。調用 add(Calendar.MONTH, 13) 將日曆設置爲 2000 年 9 月 30 日。Add 規則 1 將 MONTH 字段設置爲 September,由於向 August 添加 13 個月得出的就是下一年的 September。由於在 GregorianCalendar 中,DAY_OF_MONTH 不多是 9 月 31 日,因此 add 規則 2 將 DAY_OF_MONTH 設置爲 30,即最可能的值。儘管它是一個更小的字段,但不能根據規則 2 調整 DAY_OF_WEEK,由於在 GregorianCalendar 中的月份發生變化時,該值也須要發生變化。 roll(f, delta) 將 delta 添加到 f 字段中,但不更改更大的字段。這等同於調用 add(f, delta),但要帶如下調整: Roll 規則。在完成調用後,更大的字段無變化。更大的字段表示一個更大的時間單元。DAY_OF_MONTH 是一個比 HOUR 大的字段。 示例:請參閱 GregorianCalendar.roll(int, int)。  使用模型。爲了幫助理解 add() 和 roll() 的行爲,假定有一個用戶界面組件,它帶有用於月、日、年和底層 GregorianCalendar 的遞增或遞減按鈕。若是從界面上讀取的日期爲 1999 年 1 月 31 日,而且用戶按下月份的遞增按鈕,那麼應該獲得什麼?若是底層實現使用 set(),那麼能夠將該日期讀爲 1999 年 3 月 3 日。更好的結果是 1999 年 2 月 28 日。此外,若是用戶再次按下月份的遞增按鈕,那麼該日期應該讀爲 1999 年 3 月 31 日,而不是 1999 年 3 月 28 日。經過保存原始日期並使用 add() 或 roll(),根據是否會影響更大的字段,用戶界面能夠像大多數用戶所指望的那樣運行。
相關文章
相關標籤/搜索