Java Calendar 類
常用方法
get(int field)
示例
// 創建一個新的Calendar對象 Calendar cal = Calendar.getInstance(); // get方法, 給定一個靜態字段,返回相應的值 int year = cal.get(Calendar.YEAR); // 年 int month = cal.get(Calendar.MONTH);// 月 int day = cal.get(Calendar.DAY_OF_MONTH);// 日 int hour = cal.get(Calendar.HOUR_OF_DAY);// 時 int minute = cal.get(Calendar.MINUTE);// 分 int second = cal.get(Calendar.SECOND);// 秒 int milliSecond = cal.get(Calendar.MILLISECOND);// 毫秒 System.out.println(year + "年" + month + "月" + day + "日 " + hour + "時" + minute + "分" + second + "秒 " + milliSecond + "毫秒");
在這個示例代碼中,我們傳遞了一些參數給 get 方法,那麼這些參數是什麼意思呢? 彆着急,在介紹完 set 方法後會針對這部分做出一些解釋。
- 運行結果
set(int field)
示例
// 創建一個新的Calendar對象 Calendar cal = Calendar.getInstance(); // 通過指定的字段設置日期/時間 cal.set(Calendar.YEAR, 1999); cal.set(Calendar.MONTH, 11); cal.set(Calendar.DAY_OF_MONTH, 31); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); cal.set(Calendar.MILLISECOND, 999); // 這裏用一個日期格式化類來格式化成我們期望的日期格式 SimpleDateFormat sdf = new SimpleDateFormat( "yyyy年MM月dd日 HH時mm分ss秒 SSS毫秒"); System.out.println(sdf.format(cal.getTime()));
運行結果
需要注意的是月份是從 0 開始,0 表示 1 月,11 表示 12 月set 方法還有更多的重載,接下來演示重載方法中參數最全的一個方法爲 Calendar 對象賦值。
示例
// 創建一個新的Calendar對象 Calendar cal = Calendar.getInstance(); cal.set(2001, 11, 31, 23, 59, 1); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒"); System.out.println(sdf.format(cal.getTime()));
運行結果
從上面的示例中可以看到,調用 get / set 方法時傳遞了一些參數,那麼這些參數是什麼意思呢? 下面的表格中列舉了一些常用的字段及解釋。
字段 解釋 (相對於Calendar對象) YEAR 年份 MONTH 月份 (0 - 11) DAY_OF_MONTH 現在是當前月的第幾天 DAY_OF_WEEK 現在是當前星期的第幾天 DAY_OF_WEEK_IN_MONTH 現在是當前月的第幾個星期 DAY_OF_YEAR 現在是當前年的第幾天 HOUR 12小時制的時 HOUR_OF_DAY 24小時制的時 MINUTE 分 SECOND 秒 MILLISECOND 毫秒 WEEK_OF_MONTH 現在是當前月的第幾個星期 WEEK_OF_YEAR 現在是當前年的第幾個星期 上表中 DAY_OF_WEEK_IN_MONTH 和 WEEK_OF_MONTH 都是指示當前月份的第幾個星期,那麼它們有什麼區別呢?通過下面的示例我們來看一看。
示例
// 創建一個新的Calendar對象 Calendar cal = Calendar.getInstance(); // 將日期設置爲當前月的第一天 cal.set(Calendar.DAY_OF_MONTH, 1); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); String date; int dayOfWeekInMonth; int WeekOfMonth; // 打印當前月份前 9 天 DAY_OF_WEEK_IN_MONTH 和 WEEK_OF_MONTH 獲得的值 do { date = sdf.format(cal.getTime()); dayOfWeekInMonth = cal.get(Calendar.DAY_OF_WEEK_IN_MONTH); WeekOfMonth = cal.get(Calendar.WEEK_OF_MONTH); System.out .println(date + "\t(DAY_OF_WEEK_IN_MONTH)" + dayOfWeekInMonth + ", " + WeekOfMonth + "(WEEK_OF_MONTH)"); // 每打印一天,日加 1 cal.add(Calendar.DAY_OF_MONTH, 1); } while (cal.get(Calendar.DAY_OF_MONTH) < 10); // 當日小於 10 循環
運行結果
再看看當前月的日曆
可以看出 DAY_OF_WEEK_IN_MONTH 是從每月1日開始計算,1 至 7 日永遠是第一週,8 至 14 日永遠是第二週,以此類推。
- 而 WEEK_OF_MONTH 則是按日曆來區分的,示例中,本月只有 3 天就結束第一週,從 4 日開始就是第二週(注意,默認週日是一週的開始,但不同時區可能會有差別),不同的月份,用 WEEK_OF_MONTH 獲得的值都會有變化,這個月 4 日是第二週,下個月就不一定了!
add()
add 方法用於爲給定的日曆字段添加或減去指定的時間量。
示例
// 創建一個新的Calendar對象 Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒"); // 先設置一個時間,這個時間有點特殊,在這個時間點上增加 1 秒就是跨世紀 ^_^ cal.set(1999, 11, 31, 23, 59, 59); // 先看看原始的時間 System.out.println(sdf.format(cal.getTime())); // 爲指定的字段增加指定的時間量 cal.add(Calendar.SECOND, 1); // 增加了 1 秒 // 來看看結果 System.out.println(sdf.format(cal.getTime())); // 我們可以通過傳遞負數,實現減去指定的時間量 cal.add(Calendar.SECOND, -2);// 回到上世紀 ^_^ // 再看看結果 System.out.println(sdf.format(cal.getTime()));
運行結果
示例中僅演示了增加秒,你可以指定任何字段,年、月、日等等
before(Object when)
判斷此 Calendar 表示的時間是否在指定 Object 表示的時間之前
示例
// 創建 2 個新的Calendar對象 Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); // 爲 cal2 重新賦值 cal2.add(Calendar.DAY_OF_MONTH, -1);// 昨天 boolean result = cal1.before(cal2); // 顯然,今天在昨天之後,來看看結果 System.out.println(result);
運行結果
after(Object when)
判斷此 Calendar 表示的時間是否在指定 Object 表示的時間之後
與 before 用法相同,不再演示。
getTime()
- 返回一個Date類型的對象,不演示。
Calendar 對象還提供了非常多的方法和字段,請參考API文檔。
最後以一個 日曆 Demo 作爲結尾。
在控制檯中打印日曆
示例
Calendar cal = Calendar.getInstance(); // 取出當前日、月 int today = cal.get(Calendar.DAY_OF_MONTH); int month = cal.get(Calendar.MONTH); // 將cal對象設置爲本月第一天 cal.set(Calendar.DAY_OF_MONTH, 1); // 獲得本月第一天是星期中的第幾天 int weekday = cal.get(Calendar.DAY_OF_WEEK); // 獲得本地時區一個星期的起始日 int firstDayOfWeek = cal.getFirstDayOfWeek(); // 獲得縮進距離 int indent = 0; while (weekday != firstDayOfWeek) { indent++; // 日減 1,直到一個星期的第一天爲止 cal.add(Calendar.DAY_OF_MONTH, -1); weekday = cal.get(Calendar.DAY_OF_WEEK); } // 打印星期 ,通過DateFormatSymbols對象獲得本地時區的星期數組 String[] weekdayNames = DateFormatSymbols.getInstance() .getShortWeekdays(); do { System.out.print(weekdayNames[weekday] + "\t"); cal.add(Calendar.DAY_OF_MONTH, 1); weekday = cal.get(Calendar.DAY_OF_WEEK); } while (weekday != firstDayOfWeek); System.out.println(); // 打印縮進 for (int i = 0; i < indent; i++) { System.out.print("\t"); } // 將cal對象設置爲本月第一天 cal.set(Calendar.DAY_OF_MONTH, 1); // 打印日曆 do { int day = cal.get(Calendar.DAY_OF_MONTH); System.out.print(day); // 打印當天標記 if (day == today) { System.out.print("*\t"); } else { System.out.print("\t"); } // 日 遞增 cal.add(Calendar.DAY_OF_MONTH, 1); // 週末換行 if (cal.get(Calendar.DAY_OF_WEEK) == firstDayOfWeek) { System.out.println(); } } while (cal.get(Calendar.MONTH) == month);// 如果cal對象月份不在當月則退出循環
運行結果
總結
- Java 將時間類和日曆類分開了,時間用 Date 類,操作日曆用 Calendar 類,Calendar 類爲我們提供的很多非常便捷的方法,值得花點時間去掌握一些常用的。