JavaマスターJavaプログラムサンプル集日付・時間のサンプル → カレンダー表を作成する

カレンダー表を作成する

月のカレンダー表を作成するプログラムのサンプルです。

日付選択ダイアログやブログの目次などを作成するために、 月のカレンダー表が必要になる機会は多いと思います。 ここでは、カレンダー表を作るプログラムをご紹介します。

日付計算用のjava.util.Calendarという便利な クラスがありますので、月末や曜日を求めるといったことは このクラスを応用すれば比較的簡単に実行できます。

あとは、日曜〜土曜の7列の表に日付を並べていきます。

下記のプログラムのtoStringメソッドを変更すれば、 たとえば日付部分にリンクが付いたHTMLテーブルなども 作成できるでしょう。

samples/datetime/MonthlyCalendar.java - Eclipse SDK
package samples.datetime;
import java.util.Calendar;

public class MonthlyCalendar {
  private int year;

  private int month;

  private int[][] calendarMatrix = new int[6][7];

  private int startDay;

  private int lastDate;
  /**
   * カレンダー表オブジェクトを作成します。
   @param year 西暦年(..., 2005, 2006, 2007, ...)
   @param month 月(1, 2, 3, ..., 10, 11, 12)
   */
  public MonthlyCalendar(int year, int month) {
    this.year = year;
    this.month = month;
    calcFields();
  }

  private void calcFields() {
    Calendar calendar = Calendar.getInstance();
    calendar.clear();
    // 月の初めの曜日を求めます。
    calendar.set(year, month - 11)// 引数: 1月: 0, 2月: 1, ...
    startDay = calendar.get(Calendar.DAY_OF_WEEK);
    // 月末の日付を求めます。
    calendar.add(Calendar.MONTH, 1);
    calendar.add(Calendar.DATE, -1);
    lastDate = calendar.get(Calendar.DATE);
    // カレンダー表を作成します。
    int row = 0;
    int column = startDay - 1// startDay: 日曜日 = 1, 月曜日 = 2, ...
    for (int date = 1; date <= lastDate; date++) {
      calendarMatrix[row][column= date;
      if (column == 6) {
        row++;
        column = 0;
      else {
        column++;
      }
    }
  }

  @Override
  public String toString() {
    StringBuffer sb = new StringBuffer();
    loop: for (int i = 0; i < calendarMatrix.length; i++) {
      for (int j = 0; j < calendarMatrix[i].length; j++) {
        int day = calendarMatrix[i][j];
        if (day == 0) {
          if (i != 0) {
            // カレンダー表内の月末以降のセルに到達
            break loop;
          }
          sb.append("   ");
        else if (day < 10) {
          sb.append("  ").append(day);
        else {
          sb.append(" ").append(day);
        }
      }
      sb.append("\r\n");
    }
    return sb.toString();
  }

  public static void main(String[] args) {
    int currentYear = Calendar.getInstance().get(Calendar.YEAR);
    for (int month = 1; month <= 12; month++) {
      System.out.println(currentYear + "年" + month + "月");
      System.out.println(new MonthlyCalendar(currentYear, month));
    }
  }
}

このサンプルでは、現在年の1年分のカレンダーを出力しています。 実行結果は以下のようになります。

コマンド プロンプト

C:\JavaMaster\bin>java -cp . samples.datetime.MonthlyCalendar 
2005年1月
                    1
  2  3  4  5  6  7  8
  9 10 11 12 13 14 15
 16 17 18 19 20 21 22
 23 24 25 26 27 28 29
 30 31
2005年2月
        1  2  3  4  5
  6  7  8  9 10 11 12
 13 14 15 16 17 18 19
 20 21 22 23 24 25 26
 27 28
2005年3月
        1  2  3  4  5
  6  7  8  9 10 11 12
 13 14 15 16 17 18 19
 20 21 22 23 24 25 26
 27 28 29 30 31
2005年4月
                 1  2
  3  4  5  6  7  8  9
 10 11 12 13 14 15 16
 17 18 19 20 21 22 23
 24 25 26 27 28 29 30

2005年5月
  1  2  3  4  5  6  7
  8  9 10 11 12 13 14
 15 16 17 18 19 20 21
 22 23 24 25 26 27 28
 29 30 31
2005年6月
           1  2  3  4
  5  6  7  8  9 10 11
 12 13 14 15 16 17 18
 19 20 21 22 23 24 25
 26 27 28 29 30
2005年7月
                 1  2
  3  4  5  6  7  8  9
 10 11 12 13 14 15 16
 17 18 19 20 21 22 23
 24 25 26 27 28 29 30
 31
2005年8月
     1  2  3  4  5  6
  7  8  9 10 11 12 13
 14 15 16 17 18 19 20
 21 22 23 24 25 26 27
 28 29 30 31
2005年9月
              1  2  3
  4  5  6  7  8  9 10
 11 12 13 14 15 16 17
 18 19 20 21 22 23 24
 25 26 27 28 29 30
2005年10月
                    1
  2  3  4  5  6  7  8
  9 10 11 12 13 14 15
 16 17 18 19 20 21 22
 23 24 25 26 27 28 29
 30 31
2005年11月
        1  2  3  4  5
  6  7  8  9 10 11 12
 13 14 15 16 17 18 19
 20 21 22 23 24 25 26
 27 28 29 30
2005年12月
              1  2  3
  4  5  6  7  8  9 10
 11 12 13 14 15 16 17
 18 19 20 21 22 23 24
 25 26 27 28 29 30 31