Java Calendar 類

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_MONTHWEEK_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 類爲我們提供的很多非常便捷的方法,值得花點時間去掌握一些常用的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章