本ページはプロモーションが含まれています

Java入門

【初心者向け】Javaプログラミングでカレンダーの作り方について解説

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

Javaでカレンダーを作りたい。そのとき気になるのは「年や月の扱い方」「曜日や月末日の計算」「祝日の組み込み方」の3点です。

この記事では、LocalDateCalendarなどのJava標準ライブラリを使って、年・月の入力から整った日付の表示、さらには日本の祝日表示までを段階的に解説します。

月初の曜日に応じた整列処理や、祝日を赤く表示する仕組みも取り上げているため、シンプルかつ実用的なカレンダーアプリを一人で作れるようになります。

Javaプログラミングの基礎力を高めたい方にとって、確実にステップアップにつながる内容です。

この記事でわかること

  • CalendarクラスとLocalDateクラスの使い分け
  • 指定した年月のカレンダーを表示するコードの書き方
  • 月初めの曜日に合わせた整列処理のロジック
  • 日本の祝日(固定・可変)をカレンダーに組み込む方法
  • 祝日を赤色で表示する仕組み

設計を考える

カレンダーを作るにあたって、まずはどのような設計にするか考えます。

必要な機能

今回作成するカレンダーの仕様を考えます。

ポイント

  • 指定した年・月のカレンダーを表示
  • 曜日の表示
  • 月初めの曜日を考慮した整列

3つの機能を考慮して、以下のような出力を目指します。

2024年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

Javaのカレンダーの作り方

Javaでカレンダーを作成する方法はいくつかありますが、標準ライブラリを使う方法 が最も簡単です。

Calendarクラスを使う

Javaには Calendarクラスが用意されており、Calendarクラスを使えば簡単に日付情報を取得できます。

import java.util.Calendar;

public class CalendarExample {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance(); // カレンダーインスタンスを生成
        int year = calendar.get(Calendar.YEAR); // 年を取得
        int month = calendar.get(Calendar.MONTH) + 1; // 月を取得、月は0はじまり
        int day = calendar.get(Calendar.DAY_OF_MONTH); // 日を取得

        System.out.println("今日の日付: " + year + "年" + month + "月" + day + "日");
    }
}

出力
今日の日付: 2025年3月9日

上のコードを実行すると、今日の日付が出力されます。なお、Calendar.MONTHは0始まり(1月=0)なので、表示する際は+1が必要です。

LocalDateを使う

LocalDateクラスを使うパターンです。

import java.time.LocalDate;

public class LocalDateExample {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        System.out.println("今日の日付: " + date);
    }
}

出力
今日の日付: 2025-03-09

LocalDateの方がシンプルで使いやすいです。

コーディングしてみる

実際にカレンダーを表示するプログラムを作成します。

カレンダーを作成

LocalDateを使って、指定した年・月のカレンダーを表示するプログラムを作ります。

import java.time.LocalDate;
import java.time.DayOfWeek;
import java.util.Scanner;

public class CalendarApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // ユーザー入力
        System.out.print("年を入力してください: ");
        int year = scanner.nextInt();
        System.out.print("月を入力してください: ");
        int month = scanner.nextInt();

        // 指定した年・月のカレンダーを表示
        printCalendar(year, month);
        scanner.close();
    }

    public static void printCalendar(int year, int month) {
        LocalDate firstDay = LocalDate.of(year, month, 1);
        int lastDay = firstDay.lengthOfMonth(); // その月の最終日
        DayOfWeek startDay = firstDay.getDayOfWeek();

        System.out.println(year + "年" + month + "月のカレンダー");
        System.out.println("日 月 火 水 木 金 土");

        // 月初めの曜日に合わせて空白を出力
        int dayOfWeekValue = startDay.getValue() % 7; // Javaでは月曜=1, 日曜=7
        for (int i = 0; i < dayOfWeekValue; i++) {
            System.out.print("   ");
        }

        // 日付を出力
        for (int day = 1; day <= lastDay; day++) {
            System.out.printf("%2d ", day);
            if ((day + dayOfWeekValue) % 7 == 0) { // 土曜日で改行
                System.out.println();
            }
        }
        System.out.println();
    }
}

ポイント

  1. ユーザーが年と月を入力
  2. LocalDateを使って月初めの日付を取得
  3. その月の最終日を計算
  4. 曜日に合わせて空白を出力
  5. 日付を整列して表示

動かしてみる

CalendarAppを実行すると、任意の年・月のカレンダーが表示されます。

年を入力してください: 2024
月を入力してください: 3
2024年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

日付が正しく並ぶカレンダーが完成しました。

祝日を考慮したカレンダーを作成する

カレンダーに祝日を表示できるようにすると、より実用的なものになります。日本の祝日は毎年変わるものもあるため、固定祝日と可変祝日(毎年日付が変わる祝日、成人の日など)に対応する必要があります。

日本の祝日を考慮する方法

日本の祝日をカレンダーに追加する方法はいくつかあります。

祝日をカレンダーに追加する方法

  • 固定祝日をリストで管理する(元日、建国記念の日など)
  • 可変祝日を計算する(成人の日、敬老の日など)
  • APIを使って祝日を取得する(Google Calendar APIなど)

今回は固定祝日と可変祝日を組み合わせた方法でカレンダーを拡張します。

祝日を定義する

まず、固定祝日をMapで管理し、可変祝日 は計算します。

import java.time.LocalDate;
import java.time.DayOfWeek;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class HolidayCalendar {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // ユーザー入力
        System.out.print("年を入力してください: ");
        int year = scanner.nextInt();
        System.out.print("月を入力してください: ");
        int month = scanner.nextInt();

        // カレンダーを表示
        printCalendarWithHolidays(year, month);
        scanner.close();
    }

    public static void printCalendarWithHolidays(int year, int month) {
        LocalDate firstDay = LocalDate.of(year, month, 1);
        int lastDay = firstDay.lengthOfMonth();
        DayOfWeek startDay = firstDay.getDayOfWeek();

        // 祝日マップを取得
        Map<LocalDate, String> holidays = getHolidays(year);

        System.out.println(year + "年" + month + "月のカレンダー");
        System.out.println("日 月 火 水 木 金 土");

        // 月初めの曜日に合わせて空白を出力
        int dayOfWeekValue = startDay.getValue() % 7; // Javaでは月曜=1, 日曜=7
        for (int i = 0; i < dayOfWeekValue; i++) {
            System.out.print("   ");
        }

        // 日付を出力
        for (int day = 1; day <= lastDay; day++) {
            LocalDate date = LocalDate.of(year, month, day);
            if (holidays.containsKey(date)) {
                System.out.printf("\u001B[31m%2d\u001B[0m ", day); // 祝日は赤色表示
            } else {
                System.out.printf("%2d ", day);
            }

            if ((day + dayOfWeekValue) % 7 == 0) { // 土曜日で改行
                System.out.println();
            }
        }
        System.out.println();
    }

    public static Map<LocalDate, String> getHolidays(int year) {
        Map<LocalDate, String> holidays = new HashMap<>();

        // 固定祝日
        holidays.put(LocalDate.of(year, 1, 1), "元日");
        holidays.put(LocalDate.of(year, 2, 11), "建国記念の日");
        holidays.put(LocalDate.of(year, 4, 29), "昭和の日");
        holidays.put(LocalDate.of(year, 5, 3), "憲法記念日");
        holidays.put(LocalDate.of(year, 5, 4), "みどりの日");
        holidays.put(LocalDate.of(year, 5, 5), "こどもの日");
        holidays.put(LocalDate.of(year, 11, 3), "文化の日");
        holidays.put(LocalDate.of(year, 11, 23), "勤労感謝の日");

        // 可変祝日(第○月曜日系)
        holidays.put(getNthWeekdayOfMonth(year, 1, DayOfWeek.MONDAY, 2), "成人の日");
        holidays.put(getNthWeekdayOfMonth(year, 7, DayOfWeek.MONDAY, 3), "海の日");
        holidays.put(getNthWeekdayOfMonth(year, 9, DayOfWeek.MONDAY, 3), "敬老の日");
        holidays.put(getNthWeekdayOfMonth(year, 10, DayOfWeek.MONDAY, 2), "スポーツの日");

        return holidays;
    }

    public static LocalDate getNthWeekdayOfMonth(int year, int month, DayOfWeek weekday, int nth) {
        LocalDate date = LocalDate.of(year, month, 1);
        int count = 0;

        while (date.getMonthValue() == month) {
            if (date.getDayOfWeek() == weekday) {
                count++;
                if (count == nth) {
                    return date;
                }
            }
            date = date.plusDays(1);
        }
        return null;
    }
}

祝日が赤色で表示されるようになりました。コードのポイントを解説します。

祝日カレンダーのコード解説

getHolidays()メソッドでは、元日や建国記念の日など毎年同じ日付の固定祝日をMapに登録しています。可変祝日(成人の日、海の日など)はgetNthWeekdayOfMonth()で計算します。

getNthWeekdayOfMonth()は「第N週目の特定曜日」を求めるメソッドです。月の1日から順に曜日をチェックし、指定した曜日がN回目に出現した日付を返します。例えば「1月の第2月曜日」で成人の日を算出します。

赤色表示には\u001B[31mというANSIエスケープシーケンス(ターミナルで文字に色を付ける特殊コード)を使っています。\u001B[0mで元の色に戻します。

まとめ:Javaプログラミングでカレンダーを作る方法

Javaの標準ライブラリだけで、祝日付きカレンダーを作成しました。シンプルな実装から祝日表示の応用まで、段階的に解説しました。

【要点まとめ】

  • JavaではCalendarやLocalDateで日付操作が可能
  • カレンダーの基礎は年と月の入力から始める
  • 月初めの曜日取得で整ったカレンダー表示ができる
  • 日付は改行処理により見やすく整列させる
  • LocalDateのlengthOfMonthで月末日を取得する
  • 固定祝日はMapに登録して管理できる
  • 第○月曜日型の祝日は計算式で算出可能
  • 祝日は赤色出力で視認性を向上させる
  • Java標準ライブラリだけで実用的なカレンダーが作成可能

カレンダーが作れたら、次は数当てゲームやTodoリストアプリなど、少し複雑なプログラムに挑戦してみてください。

  • この記事を書いた人
  • 最新記事

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

-Java入門