首頁 > Java > java教程 > java時間----java.util.Calendar的詳細介紹

java時間----java.util.Calendar的詳細介紹

黄舟
發布: 2017-03-01 13:22:32
原創
1676 人瀏覽過

java.util.Calendar

在java中時間的類別有幾個,但是隨著Date被漸漸禁用,其中的方法慢慢打上了叉號,剩下能用的函數在Calendar中都已實現,而Calendar的子類別GregorianCalendar又過於深入特殊日曆的研究,平時我們並不會用到這個子類別。我們可以相信Calendar類會是以後的主流時間類,下面我們就一起看一下Calendar類的詳細內容,如果有錯誤歡迎大家指正。

(一) 實例化

Calendar類別是一個抽象類,是不能實例化的,那麼這個類別得到一個日曆實例的方法有這麼兩種:

  Calendar calendar = Calendar.getInstance(TimeZone zone , Locale locale);
登入後複製

透過呼叫getInstance方法,選擇預設的Timezone和Locale屬性,從而傳回一個行事曆,也可以在其中加上參數Timezone或Locale從而選擇地域地點,具體的參數要去看java.util.Timezone,java.util. Locale這兩個包,一般的預設時間是公用的時間我們其實並不需要改動。

除此之外,還有一個能夠實例化的方法。沒什麼稀奇的,java的老套路用子類別來實例化。 Calendar的子類別只有一個-GregorianCalendar,翻譯過來就是公曆的意思,這個GregorianCalendar我們以後還會單講。實例化的第二種方式如下:

Calendar calendar = new GregorianCalendar();
登入後複製


#(二) 類別變數

Calendar中變數基本上都用final限定,這些變數將年份,月份,小時,上下午等等所有的時間內容全部包含了。百度上一找一大堆,這種具體要用的時候最好還是看API,我這裡姑且簡要粘貼一份:

calendar.get(Calendar.YEAR);  
calendar.get(Calendar.MONTH); 
// 月份从0开始 calendar.get(Calendar.DAY_OF_MONTH);   
calendar.get(Calendar.DAY_OF_WEEK);  
calendar.get(Calendar.WEEK_OF_YEAR);  
calendar.get(Calendar.WEEK_OF_MONTH);  
calendar.get(Calendar.HOUR);        
// 12小时calendar.get(Calendar.HOUR_OF_DAY); 
// 24小时 calendar.get(Calendar.MINUTE);  
calendar.get(Calendar.SECOND);  
calendar.get(Calendar.MILLISECOND);
登入後複製

這些值在jdk的源碼中都是final變量,既然是int static final修飾,也就是說明這些變數都是有int型別的初始值的。的確如此,Calendar類別中為這些變數依序編號,作為一些函數傳入參數時的範圍判斷。那麼一不小心有可能會出現這種情況,例如以下程式碼:

System.out.println(Calendar.DAY_OF_MOUTH);
登入後複製

輸出的是5,儘管今天並不是這個月的5號。這其實是個錯誤,其實你輸出的是這個類別中DAY_OF_MOUTH的初始值5,如果你要表示當前月的日期,一定要將類別實例出對象,但是在類別的變數可以直接點出來的類別中,這種錯誤的發生還是很常見的。正確的方法應該用get()方法來取得(calendar是我們實例的物件):

System.out.println(calendar.get(Calendar.DAY_OF_MOUTH));
登入後複製

(三) compareTo() after() before() 函數

#compareTo(Calendar othercalendar ),傳回int值,如果物件的時間在參數時間之後回傳一個大於0的數字,否則傳回一個小於0的數字,特別的,如果時間相同回傳0,我覺得這個方法的實作可能直接傳回了毫秒數做個差(感覺自己推測好有道理…),毫秒的差值來做回傳值。
after(Calendar othercalendar),before(Calendar othercalendar),這兩個函數也很好猜測,返回的是boolean值,after()函數如果時間在參數之後返回正值,before()函數時間在參數之前返回正值。

Calendar calendar = Calendar.getInstance();
Calendar calendarother = Calendar.getInstance();
calendarother.add(Calendar.DATE, -20);
if(calendar.after(calendarother))
    System.out.println("after");calendarother.add(Calendar.DATE, 100);if(calendar.before(calendarother))
    System.out.println("before");if(calendar.compareTo(calendarother)>0)
        System.out.println(calendar.getTime()+">"+calendarother.getTime());
登入後複製

輸出的結果是:

after 

  before 

  Sun Jan 11 21:19:49 GMT+08:00 1970>Thu Jan 01 00:00:00 GMT+08:00 1970
登入後複製


#(四) get() add() set() setTime() 函數

上面的範例中出現了add(int field, int amount)這個函數,這個函數的功能比較強大,可以對第一個參數的值加減,從而修改這個日曆實體中對應項的數值。

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
System.out.println(calendar.getTime());
//输出的日期是当前日期的前一天,其他所有的都不变
登入後複製

get(int field)這個沒有什麼好說的,把要取得值放進去顯示出來,如是而已,順便提一句getTimeInMillis(),返回毫秒數,實際應用中,這個毫秒數用的還是比較多的。
set()方法有很多群組參數輸入方式,寫的上就看得懂,setTime()這個函數將一個Date物件放進去,回傳一個依照Date的日期設定行事曆。另外特殊要注意的地方就是,月份是從0開始算的,把月份設定為0實際是一月份,設定為1實際為二月份,一週的第1天是星期日,第7天是星期六。

calendar.get(Calendar.DATE);
calendar.getTimeInMillis();

calendar.set(field, value);
calendar.set(year, month, date);
//月份是从0开始,下同
calendar.set(year, month, date, hourOfDay, minute);
calendar.set(year, month, date, hourOfDay, minute, second);
calendar.setTime(Date date);
//Date对象
登入後複製

(五) getTime() clear() isSet() 函數

getTime()函數是回傳一個時間,大概是這個格式的

#Sun Jan 11 21:19:49 GMT+08:00 1970

可以用時間格式化的方法來變成自己喜歡的樣子,具體看我的另外的博客,這個函數也沒有太多的槽點。 clear()函數在無參數的情況下是對物件中的所有變數進行清空,清空後的時間直接打回原形,變成

Thu Jan 01 00:00:00 GMT+ 08:00 1970

clear()也可以附帶參數int field,表示單單清除這個數值:

calendar.clear(Calendar.YEAR);System.out.println(calendar.getTime());
登入後複製

上述代码最后显示的年份是1970年(不可能清除成0000年…),其他的也可以以此类推。
isSet()方法确定日历字段是否已经设置了一个值,有些值会因为get方法触发计算而被设置,很多的时候,只要进行了初始化,很多值已经被设置了,但是作为一个boolean返回值的函数,检测的时候我们相信还是会起到作用的。

if(calendar.isSet(Calendar.DATE))
登入後複製

(六) 总结

Calendar类正如其名,可以实现一个日历,对其进行操作且功能较为完整。如果你只是需要一个时间,这个类并不一定比new Date()能快多少,但是对于一些细节的操作,还是有很多值得我们学习的地方。

 以上就是java时间----java.util.Calendar的详细介绍的内容,更多相关内容请关注PHP中文网(www.php.cn)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板