Calendar是Android開發中需要獲取時間時必不可少的一個工具類,通過這個類可以獲得的時間信息還是很豐富的,下面做一個總結,以后使用的時候就不用總是去翻書或者查資料了。
在獲取時間之前要先獲得Calendar這個類的實例:
- private Calendar c = Calendar.getInstance();
然后就可以用這個變量來獲取時間了。
獲得當前的年份
- Log.i("MainActivityFilter", "當前的年份為:" + c.get(Calendar.YEAR));

獲得當前的月份
- Log.i("MainActivityFilter", "當前的月份為:" + (c.get(Calendar.MONTH) + 1));

這個要特別注意一下,月份在Calendar中是從0開始的,也就是說1月份的值為0,因此需要加1才是現實中表示的月份
獲得今天是本月的第幾天,有兩種寫法,結果是一樣的
- Log.i("MainActivityFilter", "DATE:" + c.get(Calendar.DATE));
- Log.i("MainActivityFilter", "DAY_OF_MONTH:" + c.get(Calendar.DAY_OF_MONTH));

獲得今天是本年的第幾天
- Log.i("MainActivityFilter", "今天是今年的第" + c.get(Calendar.DAY_OF_YEAR) + "天");

獲得今天在本月的第幾周
- Log.i("MainActivityFilter", "今天在本月的第" + c.get(Calendar.DAY_OF_WEEK_IN_MONTH) + "周");

獲得今天是周幾,這里不能直接將返回值當做周幾,而應該與Calendar用於表示周幾的常量搭配使用,返回值為3不代表今天是周三
- private void printDayOfWeek() {
- switch (c.get(Calendar.DAY_OF_WEEK)) {
- case Calendar.SUNDAY:
- Log.i("MainActivityFilter", "今天是周日");
- break;
- case Calendar.MONDAY:
- Log.i("MainActivityFilter", "今天是周一");
- break;
- case Calendar.TUESDAY:
- Log.i("MainActivityFilter", "今天是周二");
- break;
- case Calendar.WEDNESDAY:
- Log.i("MainActivityFilter", "今天是周三");
- break;
- case Calendar.THURSDAY:
- Log.i("MainActivityFilter", "今天是周四");
- break;
- case Calendar.FRIDAY:
- Log.i("MainActivityFilter", "今天是周五");
- break;
- case Calendar.SATURDAY:
- Log.i("MainActivityFilter", "今天是周六");
- break;
- default:
- break;
- }
- }

獲得今天是幾點,12小時制
- Log.i("MainActivityFilter", "現在是" + c.get(Calendar.HOUR) + "點");

但現在其實是下午三點,所以需要區分是上午還是下午
- if (c.get(Calendar.AM_PM) == Calendar.AM) {
- Log.i("MainActivityFilter", "現在是上午");
- } else {
- Log.i("MainActivityFilter", "現在是下午");
- }
使用Calendar.AM和Calendar.PM來幫助判斷是上午還是下午,如果c.get(Calendar.AM_PM)獲取到的值和Calendar.AM相等就是上午,如果和Calendar.PM相等就是下午

Calendar也提供了獲取24小時制時間的方法
- Log.i("MainActivityFilter", "現在是" + c.get(Calendar.HOUR_OF_DAY) + "點");

獲得現在是幾分
- Log.i("MainActivityFilter", "現在是" + c.get(Calendar.MINUTE) + "分");

獲得現在是幾秒
- Log.i("MainActivityFilter", "現在是" + c.get(Calendar.SECOND) + "秒");

獲得現在是幾毫秒
- Log.i("MainActivityFilter", "現在是" + c.get(Calendar.MILLISECOND) + "毫秒");

Calendar雖然不提供顯示規范格式時間的方法,但是可以用SimpleDateFormat來輸出規范的字符串,這里簡單示范一下用法
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
- Log.i("MainActivityFilter", sdf.format(c.getTime()));

關於SimpleDateFormat的更詳細的用法之后會用另外一篇文章來講
Calendar還提供了一些其它的方法,接下來關於時間的輸出都是用SimpleDateFormat來輸出的,就不貼輸出的代碼了。
增加日期中的某個域的值,比如想獲得明天的日期,就需要向DAY域加1

- c.add(Calendar.DAY_OF_MONTH, 1);
加之前

加之后

這樣對程序員就比較方便,不用去考慮各種界限的問題
比較兩個日期是否相等

- private Calendar c = Calendar.getInstance();
- private Calendar d = Calendar.getInstance();
- Log.i("MainActivityFilter", "c和d是否相等:" + c.equals(d));
- c.add(Calendar.YEAR, 1);
- Log.i("MainActivityFilter", "c和d是否相等:" + c.equals(d));

比較兩個日期哪個更靠后一些

- private Calendar c = Calendar.getInstance();
- private Calendar d = Calendar.getInstance();
- private SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
- d.add(Calendar.DAY_OF_MONTH, 1);
- Log.i("MainActivityFilter", "d在c后面:" + d.after(c));

同樣,有方法可以用來判斷兩個日期哪個更靠前

- Log.i("MainActivityFilter", "c在d前面:" + c.before(d));

清空某一個域並用這個域最小的值代替和清空所有的域然后全部用最小的值代替

- c.clear(Calendar.MONTH);
- d.clear();
- Log.i("MainActivityFilter", "c:" + sdf.format(c.getTime()));
- Log.i("MainActivityFilter", "d:" + sdf.format(d.getTime()));

獲得Calendar對象的一個深拷貝

- d = (Calendar) c.clone();
- Log.i("MainActivityFilter", "c:" + sdf.format(c.getTime()));
- Log.i("MainActivityFilter", "d:" + sdf.format(d.getTime()));
- c.add(Calendar.YEAR, 1);
- Log.i("MainActivityFilter", "c:" + sdf.format(c.getTime()));
- Log.i("MainActivityFilter", "d:" + sdf.format(d.getTime()));

比較兩個Calendar哪個在前哪個在后的方法

如果調用這個方法的Calendar實例比參數給出的Calendar實例要靠前一些,返回-1,如果要靠后一些,返回1,如果相等,返回0
- d = (Calendar) c.clone();
- Log.i("MainActivityFilter", "比較的結果:" + c.compareTo(d));
- c.add(Calendar.YEAR, 1);
- Log.i("MainActivityFilter", "比較的結果:" + c.compareTo(d));
- d.add(Calendar.YEAR, 2);
- Log.i("MainActivityFilter", "比較的結果:" + c.compareTo(d));

將當前Calendar對象轉換為Date對象

為Calendar對象的域設置值的一些方法

還有將Date對象設置給Calendar對象的方法

Calendar還提供了一些關於時區,地域方面的方法,還有一些奇怪的方法,比如獲取某個Calendar所處的時間是公元前還是公元后的方法。。。這些方法如果以后在實戰中有運用到,再來更新這篇文章。
本篇文章中所使用到的部分代碼已經上傳至github,地址:https://github.com/sysukehan/AndroidTests.Git,為android Studio項目,其中的CalendarTest模塊包含本文使用的代碼。
