一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java時間 java.util.Calendar深入分析

java時間 java.util.Calendar深入分析

2020-08-14 15:51anquye200 Java教程

這篇文章主要介紹了java時間 java.util.Calendar深入分析的相關資料,需要的朋友可以參考下

java.util.Calendar

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

(一) 實例化

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

?
1
Calendar calendar = Calendar.getInstance(TimeZone zone , Locale locale);

通過調用getInstance方法,選擇默認的Timezone和Locale屬性,從而返回一個日歷,也可以在其中加上參數Timezone或Locale從而選擇地域地點,具體的參數要去看java.util.Timezone,java.util.Locale這兩個包,一般的默認時間是公用的時間我們其實并不需要改動。

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

?
1
Calendar calendar = new GregorianCalendar();

(二) 類變量

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

?
1
2
3
4
5
6
7
8
9
10
11
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類中為這些變量依次編號,作為一些函數傳入參數時的范圍判斷。那么一不小心有可能會出現這種情況,比如以下代碼:

?
1
System.out.println(Calendar.DAY_OF_MOUTH);

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

?
1
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()函數時間在參數之前返回正值。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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());

輸出的結果是:

?
1
2
3
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)這個函數,這個函數的功能比較強大,可以對第一個參數的值進行加減,從而修改這個日歷實體中對應項的數值。

?
1
2
3
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天是星期六。

?
1
2
3
4
5
6
7
8
9
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()函數是返回一個時間,大概是這個格式的

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

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

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

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

?
1
2
calendar.clear(Calendar.YEAR);
System.out.println(calendar.getTime());

上述代碼最后顯示的年份是1970年(不可能清除成0000年…),其他的也可以以此類推。
isSet()方法確定日歷字段是否已經設置了一個值,有些值會因為get方法觸發計算而被設置,很多的時候,只要進行了初始化,很多值已經被設置了,但是作為一個boolean返回值的函數,檢測的時候我們相信還是會起到作用的。

?
1
if(calendar.isSet(Calendar.DATE))

(六) 總結

Calendar類正如其名,可以實現一個日歷,對其進行操作且功能較為完整。如果你只是需要一個時間,這個類并不一定比new Date()能快多少,但是對于一些細節的操作,還是有很多值得我們學習的地方。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/quinnnorris/article/details/54348774

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲看片lutube在线入口 | 九九国产在线观看 | 99精品国产高清自在线看超 | 五月婷婷俺也去开心 | 黑帮少爷爱上我第8集最新 荷兰精品女人性hd 和日本免费不卡在线v | 亚洲精品午夜久久aaa级久久久 | 办公室恋情在线观看 | 秋霞理论在一l级毛片 | 精品视频久久久久 | 国产微拍精品一区 | 午夜亚洲WWW湿好大 午夜想想爱 | 亚洲福利 影院 | 第一福利在线导航 | 国产成人激情 | 国产成人h视频在线播放网站 | 亚洲 欧美 国产 综合首页 | a级特黄毛片免费观看 | 九色PORNY真实丨国产免费 | 亚洲免费一| 俄罗斯烧性春三级k8播放 | 免费看片aⅴ免费大片 | 日韩伦理在线免费观看 | 四虎成人影院 | 国产三级精品久久三级国专区 | 精品一区二区三区在线视频观看 | 亚洲色欲色欲综合网站 | 亚洲香蕉综合在人在线视看 | 日韩国产成人精品视频人 | 91久久偷偷做嫩草影院免费 | 水野朝阳厨房系列在线观看 | 亚洲精品视频观看 | 青青青在线视频 | 日韩国产成人资源精品视频 | 特黄一级大片 | 国产探花视频在线观看 | 国产成人欧美视频在线 | 波多野结衣中文字幕乱七八糟 | 国产91在线精品狼人 | 亚洲AV无码乱码国产麻豆穿越 | 男人的天堂在线观看入口 | 免费观看大片毛片 |