JAVA Calendar

post200發表於2021-09-09

Calendar.getInstance() 中所獲得的例項就是一個 "GreogrianCalendar" 物件(與透過 new GregorianCalendar() 獲得的結果一致)。

Calendar 與 Date 的轉換

Calendar calendar = Calendar.getInstance();
// 從一個 Calendar 物件中獲取 Date 物件
Date date = calendar.getTime();
// 將 Date 物件反應到一個 Calendar 物件中,
// Calendar/GregorianCalendar 沒有建構函式可以接受 Date 物件
// 所以我們必需先獲得一個例項,然後設定 Date 物件
calendar.setTime(date);

注意的事項:

1. Calendar 的 set() 方法

set(int field, int value) - 是用來設定"年/月/日/小時/分鐘/秒/微秒"等值

field 的定義在 Calendar 中

set(int year, int month, int day, int hour, int minute, int second) 但沒有

set(int year, int month, int day, int hour, int minute, int second, int millisecond) 前面 set(int,int,int,int,int,int) 方法不會自動將 MilliSecond 清為 0。

另外,月份的起始值為0而不是1,所以要設定八月時,我們用7而不是8。

calendar.set(Calendar.MONTH, 7);

我們通常需要在程式邏輯中將它清為 0, Calendar 不是馬上就重新整理其內部的記錄

在 Calendar 的方法中,get() 和 add() 會讓 Calendar 立刻重新整理。Set() 的這個特性會給我們的開發帶來一些意想不到的結果。

add() 與 roll() 的區別

add() 的功能非常強大,add 可以對 Calendar 的欄位進行計算。如果需要減去值,那麼使用負數值就可以了,如 add(field, -value)。

add() 有兩條規則:

當被修改的欄位超出它可以的範圍時,那麼比它大的欄位會自動修正。如:
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31
cal1.add(Calendar.MONTH, 1); //2000-9-31 => 2000-10-1,對嗎?
System.out.println(cal1.getTime()); //結果是 2000-9-30

另一個規則是,如果比它小的欄位是不可變的(由 Calendar 的實現類決定),那麼該小欄位會修正到變化最小的值。

以上面的例子,9-31 就會變成 9-30,因為變化最小。

Roll() 的規則只有一條:
當被修改的欄位超出它可以的範圍時,那麼比它大的欄位不會被修正。如:

Calendar cal1 = Calendar.getInstance();
cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 週日
cal1.roll(Calendar.WEEK_OF_MONTH, -1); //1999-6-1, 週二
cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 週日
cal1.add(Calendar.WEEK_OF_MONTH, -1); //1999-5-30, 週日
WEEK_OF_MONTH 比 MONTH 欄位小,所以 roll 不能修正 MONTH 欄位。



作者:芥末無疆sss
連結:
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2249/viewspace-2816170/,如需轉載,請註明出處,否則將追究法律責任。

相關文章