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();
}
}動かしてみる
このプログラムを実行すると、任意の年・月のカレンダー が表示されます。
年を入力してください: 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;
}
}これで祝日は赤色で出力ができたかと思います。
まとめ:Javaプログラミングでカレンダーを作る方法
この記事では、Java初心者でも実践できる「カレンダー作成」の手順について解説しました。
標準ライブラリを活用したシンプルな実装から、祝日表示を含む応用的な機能まで段階的に紹介しています。
Javaの基本文法や日付操作を学びながら、実用的なアプリケーション開発の第一歩を踏み出せる内容になっています。
【要点まとめ】
- JavaではCalendarやLocalDateで日付操作が可能
- カレンダーの基礎は年と月の入力から始める
- 月初めの曜日取得で整ったカレンダー表示ができる
- 日付は改行処理により見やすく整列させる
- LocalDateのlengthOfMonthで月末日を取得する
- 固定祝日はMapに登録して管理できる
- 第○月曜日型の祝日は計算式で算出可能
- 祝日は赤色出力で視認性を向上させる
- Java標準ライブラリだけで実用的なカレンダーが作成可能
この記事を読むことで、Javaの基礎文法だけでなく、実用的なアプリケーションの構築手順も学ぶことができます。