Javaでカレンダーを作りたい。そのとき気になるのは「年や月の扱い方」「曜日や月末日の計算」「祝日の組み込み方」の3点です。
この記事では、LocalDateやCalendarなどのJava標準ライブラリを使って、年・月の入力から整った日付の表示、さらには日本の祝日表示までを段階的に解説します。
月初の曜日に応じた整列処理や、祝日を赤く表示する仕組みも取り上げているため、シンプルかつ実用的なカレンダーアプリを一人で作れるようになります。
Javaプログラミングの基礎力を高めたい方にとって、確実にステップアップにつながる内容です。
設計を考える
カレンダーを作るにあたって、まずはどのような設計にするか考えます。
必要な機能
今回作成するカレンダーの仕様を考えます。
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-09LocalDateの方がシンプルで使いやすいです。
コーディングしてみる
実際にカレンダーを表示するプログラムを作成します。
カレンダーを作成
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();
}
}動かしてみる
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
日付が正しく並ぶカレンダーが完成しました。
祝日を考慮したカレンダーを作成する
カレンダーに祝日を表示できるようにすると、より実用的なものになります。日本の祝日は毎年変わるものもあるため、固定祝日と可変祝日(毎年日付が変わる祝日、成人の日など)に対応する必要があります。
日本の祝日を考慮する方法
日本の祝日をカレンダーに追加する方法はいくつかあります。
今回は固定祝日と可変祝日を組み合わせた方法でカレンダーを拡張します。
祝日を定義する
まず、固定祝日を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リストアプリなど、少し複雑なプログラムに挑戦してみてください。