LocalDateクラスを新人エンジニアに解説

こんにちは。ゆうせいです。
今回は、JavaのLocalDateクラスについて解説します!LocalDateは、日付を操作するためのJava 8以降で導入された新しい日時APIの一部で、特に「日付のみ」を扱う場合に便利なクラスです。


LocalDateとは?

LocalDateは、日付(年、月、日)を表すクラスで、時間やタイムゾーンの情報を含まない日付データを扱います。このクラスは不変(immutable)でスレッドセーフなので、安全に使えます。

例えるなら…

LocalDateは「カレンダー」のようなものです。現在の日付、過去の日付、未来の日付を簡単に扱うことができます。


LocalDateの基本的な使い方

1. LocalDateオブジェクトの作成

現在の日付を取得

LocalDate.now()を使うと、現在の日付を取得できます。

import java.time.LocalDate;

LocalDate today = LocalDate.now();
System.out.println("今日の日付: " + today);

特定の日付を生成

LocalDate.of()メソッドで指定した日付を生成します。

LocalDate specificDate = LocalDate.of(2025, 1, 1); // 2025年1月1日
System.out.println("指定した日付: " + specificDate);

文字列から日付を生成

LocalDate.parse()を使うと、文字列を日付に変換できます。

LocalDate parsedDate = LocalDate.parse("2025-01-01");
System.out.println("パースした日付: " + parsedDate);


2. 年月日情報の取得

日付の各要素を簡単に取得できます。

LocalDate today = LocalDate.now();

int year = today.getYear();       // 年を取得
int month = today.getMonthValue(); // 月を数値で取得
int day = today.getDayOfMonth();  // 日を取得

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

曜日も取得できます。

System.out.println("曜日: " + today.getDayOfWeek()); // 曜日(MONDAY, TUESDAYなど)




3. 日付の操作

LocalDateは日付の計算が非常に簡単です。

日付を加算

LocalDate nextWeek = today.plusWeeks(1);  // 1週間後
LocalDate nextMonth = today.plusMonths(1); // 1か月後
LocalDate nextYear = today.plusYears(1);  // 1年後

System.out.println("1週間後: " + nextWeek);
System.out.println("1か月後: " + nextMonth);
System.out.println("1年後: " + nextYear);

日付を減算

LocalDate lastWeek = today.minusWeeks(1);  // 1週間前
LocalDate lastMonth = today.minusMonths(1); // 1か月前
LocalDate lastYear = today.minusYears(1);  // 1年前

System.out.println("1週間前: " + lastWeek);
System.out.println("1か月前: " + lastMonth);
System.out.println("1年前: " + lastYear);


4. 日付の比較

日付の比較にはisBefore()isAfter(), equals()を使用します。

LocalDate date1 = LocalDate.of(2025, 1, 1);
LocalDate date2 = LocalDate.of(2025, 12, 31);

if (date1.isBefore(date2)) {
    System.out.println(date1 + " は " + date2 + " より前の日付です");
}

if (date2.isAfter(date1)) {
    System.out.println(date2 + " は " + date1 + " より後の日付です");
}


5. 日付のチェック

うるう年かどうかを判定

if (today.isLeapYear()) {
    System.out.println("今年はうるう年です");
} else {
    System.out.println("今年はうるう年ではありません");
}

月の日数を取得

int daysInMonth = today.lengthOfMonth();
System.out.println("今月の日数: " + daysInMonth);

年の日数を取得

int daysInYear = today.lengthOfYear();
System.out.println("今年の日数: " + daysInYear);


LocalDateのメリットと注意点

メリット

  1. 直感的なAPI:日付の加減算や比較が簡単。
  2. 安全性:不変オブジェクトでスレッドセーフ。
  3. タイムゾーンを考慮しない:日付のみを扱うのでシンプル。

注意点

  1. 時刻やタイムゾーンは扱えない:必要ならLocalDateTimeZonedDateTimeを使用する。
  2. フォーマット変更には別クラスが必要:日付を特定の形式で表示するにはDateTimeFormatterを使う。

実用例

1. 次の給料日を計算

例えば、毎月25日が給料日の場合、今日から次回の給料日を計算:

LocalDate today = LocalDate.now();
LocalDate payday = today.withDayOfMonth(25);

if (today.isAfter(payday)) {
    payday = payday.plusMonths(1); // 今月の給料日が過ぎていれば次の月に移動
}

System.out.println("次の給料日: " + payday);


2. 年末までの日数を計算

LocalDate today = LocalDate.now();
LocalDate endOfYear = LocalDate.of(today.getYear(), 12, 31);

long daysUntilEndOfYear = java.time.temporal.ChronoUnit.DAYS.between(today, endOfYear);
System.out.println("年末まであと " + daysUntilEndOfYear + " 日");


3. 日付の文字列フォーマット

日付を特定の形式で表示する場合は、DateTimeFormatterを使います。

import java.time.format.DateTimeFormatter;

LocalDate today = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");

String formattedDate = today.format(formatter);
System.out.println("フォーマットされた日付: " + formattedDate);


練習問題

問題:次回の祝日を計算するプログラム

  1. ユーザーから日付を入力。
  2. その日付から次の祝日(例えば1月1日)が何日後か計算。

ヒント

  • LocalDate.parse()で文字列を日付に変換。
  • ChronoUnit.DAYS.between()で日数を計算。

まとめと次のステップ

LocalDateは、日付をシンプルかつ直感的に操作するための強力なツールです。従来のDateCalendarに比べ、読みやすく、安全なコードが書けます。次に学ぶと良いテーマは以下の通りです。

  1. LocalTime:時刻を扱うクラス。
  2. LocalDateTime:日付と時刻を組み合わせたクラス。
  3. DateTimeFormatter:日付のフォーマット変換。

ぜひ、プログラムで試してみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。