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

Java入門

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

トム

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

Javaでカレンダーを作成したいと考えたとき、最初に気になるのは「どうやって年や月を扱うか」「曜日や月末日をどう計算するか」、そして「祝日をどう組み込むか」ではないでしょうか。

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

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

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

設計を考える

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

必要な機能

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

ポイント

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

これらを考慮して、以下のような出力を目指します。

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クラス が用意されており、これを使うことで簡単に日付情報を取得できます。

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日

このコードを実行すると、今日の日付 が出力されます。

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 を使って、指定した年・月のカレンダーを表示するプログラムを作ります。

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. 日付を整列して表示

動かしてみる

このプログラムを実行すると、任意の年・月のカレンダー が表示されます。

年を入力してください: 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;
    }
}

これで祝日は赤色で出力ができたかと思います。

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

この記事では、Java初心者でも実践できる「カレンダー作成」の手順について解説しました。

標準ライブラリを活用したシンプルな実装から、祝日表示を含む応用的な機能まで段階的に紹介しています。

Javaの基本文法や日付操作を学びながら、実用的なアプリケーション開発の第一歩を踏み出せる内容になっています。

【要点まとめ】

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

この記事を読むことで、Javaの基礎文法だけでなく、実用的なアプリケーションの構築手順も学ぶことができます。

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

トム

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

-Java入門