set(f, value) 將日歷字段 f 更改為 value。此外,它設(shè)置了一個(gè)內(nèi)部成員變量,以指示日歷字段 f
已經(jīng)被更改。盡管日歷字段
f
是立即更改的,但是直到下次調(diào)用 get()
、getTime()
、
getTimeInMillis()
、add()
或 roll()
時(shí)才會(huì)重新計(jì)算日歷的時(shí)間值(以毫秒為單位)。因
此,多次調(diào)用 set()
不會(huì)觸發(fā)多次不必要的計(jì)算。使用 set()
更改日歷字段的結(jié)果是,其他日
歷字段也可能發(fā)生更改,這取決于日歷字段、日歷字段值和日歷系統(tǒng)。此外,在重新計(jì)算日歷
字段之后,get(f)
沒(méi)必要通過(guò)調(diào)用 set
方法返回 value
集合。具體細(xì)節(jié)是通過(guò)具體的日歷類確
定的。
示例:假定 GregorianCalendar
最初被設(shè)置為 1999 年 8 月 31 日。調(diào)用 set(Calendar.MONTH,
Calendar.SEPTEMBER)
將該日期設(shè)置為 1999 年 9 月 31 日。如果隨后調(diào)用 getTime()
,那么這
是解析 1999 年 10 月 1 日的一個(gè)暫時(shí)內(nèi)部表示。但是,在調(diào)用 getTime()
之前調(diào)用 set(Calen
dar.DAY_OF_MONTH, 30)
會(huì)將該日期設(shè)置為 1999 年 9 月 30 日,因?yàn)樵谡{(diào)用 set()
之后沒(méi)有發(fā)
生重新計(jì)算。
add(f, delta)
將 delta
添加到 f
字段中。這等同于調(diào)用 set(f, get(f) + delta)
,但要帶
以下兩個(gè)調(diào)整:
Add 規(guī)則 1。調(diào)用后
f
字段的值減去調(diào)用前f
字段的值等于delta
,以字段f
中發(fā)生的任何溢出為模。溢出發(fā)生在字段值超出其范圍時(shí),結(jié)果,下一個(gè)更大的字段會(huì)
遞增或遞減,并將字段值調(diào)整回其范圍內(nèi)。
Add 規(guī)則 2。如果期望某一個(gè)更小的字段是不變的,但讓它等于以前的值是不可能
的,因?yàn)樵谧侄?
f
發(fā)生更改之后,或者在出現(xiàn)其他約束之后,比如時(shí)區(qū)偏移量發(fā)生更改,它的最大值和最小值也在發(fā)生更改,然后它的值被調(diào)整為盡量接近于所期望
的值。更小的字段表示一個(gè)更小的時(shí)間單元。
HOUR
是一個(gè)比DAY_OF_MONTH
小的字段。對(duì)于不期望是不變字段的更小字段,無(wú)需進(jìn)行任何調(diào)整。日歷系統(tǒng)會(huì)確定期望
不變的那些字段。
此外,與 set()
不同,add()
強(qiáng)迫日歷系統(tǒng)立即重新計(jì)算日歷的毫秒數(shù)和所有字段。
示例:假定 GregorianCalendar
最初被設(shè)置為 1999 年 8 月 31 日。調(diào)用 add(Calendar.MONTH,
13)
將日歷設(shè)置為 2000 年 9 月 30 日。Add 規(guī)則 1 將 MONTH
字段設(shè)置為 September,因?yàn)橄?
August 添加 13 個(gè)月得出的就是下一年的 September。因?yàn)樵?GregorianCalendar
中,DAY_OF_
MONTH
不可能是 9 月 31 日,所以 add 規(guī)則 2 將 DAY_OF_MONTH
設(shè)置為 30,即最可能的值。盡
管它是一個(gè)更小的字段,但不能根據(jù)規(guī)則 2 調(diào)整 DAY_OF_WEEK
,因?yàn)樵?GregorianCalendar
中
的月份發(fā)生變化時(shí),該值也需要發(fā)生變化。
roll(f, delta)
將 delta
添加到 f
字段中,但不更改更大的字段。這等同于調(diào)用 add(f, del
ta)
,但要帶以下調(diào)整:
Roll 規(guī)則。在完成調(diào)用后,更大的字段無(wú)變化。更大的字段表示一個(gè)更大的時(shí)間單
元。
DAY_OF_MONTH
是一個(gè)比HOUR
大的字段。
示例:請(qǐng)參閱 GregorianCalendar.roll(int, int)
。
使用模型。為了幫助理解 add()
和 roll()
的行為,假定有一個(gè)用戶界面組件,它帶有用于月、
日、年和底層 GregorianCalendar
的遞增或遞減按鈕。如果從界面上讀取的日期為 1999 年 1
月 31 日,并且用戶按下月份的遞增按鈕,那么應(yīng)該得到什么?如果底層實(shí)現(xiàn)使用 set()
,那么
可以將該日期讀為 1999 年 3 月 3 日。更好的結(jié)果是 1999 年 2 月 28 日。此外,如果用戶再次
按下月份的遞增按鈕,那么該日期應(yīng)該讀為 1999 年 3 月 31 日,而不是 1999 年 3 月 28 日。
通過(guò)保存原始日期并使用 add()
或 roll()
,根據(jù)是否會(huì)影響更大的字段,用戶界面可以像大多
數(shù)用戶所期望的那樣運(yùn)行。
聯(lián)系客服