Java | Java 標準ライブラリ:LocalDate

Java Java
スポンサーリンク

LocalDate をざっくり一言でいうと

LocalDate は、

「タイムゾーンも時刻も持たない、“純粋な日付(年・月・日だけ)”」
をあつかうためのクラスです。

誕生日、締切日、営業日、請求日など、
「その日」が分かればよくて「何時か」はいらない場面にピッタリです。

Date のようにミリ秒やタイムゾーンを意識する必要はなく、
「2025 年 12 月 25 日」という“日付そのもの”だけを安全に持てます。


LocalDate の基本イメージと生成

「今日」「特定の日付」を作る

LocalDatejava.time パッケージにあるクラスです。

一番よく使うのはこの 2 つです。

import java.time.LocalDate;

public class LocalDateBasic {
    public static void main(String[] args) {
        // 今日
        LocalDate today = LocalDate.now();
        System.out.println("today = " + today); // 例: 2025-12-25

        // 特定の日付(2025-12-25)
        LocalDate christmas = LocalDate.of(2025, 12, 25);
        System.out.println("christmas = " + christmas); // 2025-12-25
    }
}
Java

ここで重要なのは、

  • LocalDate.now() には「システムのデフォルトタイムゾーン」が使われる
  • とはいえ、LocalDate 自体は「タイムゾーン情報を保持しない純粋な日付オブジェクト」

という点です。

of(年, 月, 日) の月は、1 が 1 月、12 が 12 月 なので、
古い Date のような「0 始まり」トラップが無いのも安心ポイントです。

「年・月・日」の取り出し

LocalDate date = LocalDate.of(2025, 12, 25);

int year  = date.getYear();        // 2025
int month = date.getMonthValue();  // 12
int day   = date.getDayOfMonth();  // 25

System.out.println(year + "/" + month + "/" + day); // 2025/12/25
Java

getMonth() だと Month という enum(DECEMBER など)が返りますが、
初心者のうちは getMonthValue() が分かりやすいと思って良いです。


LocalDate の「不変性」と安心ポイント

LocalDate は“書き換え不能(immutable)”

LocalDate不変(immutable) です。

LocalDate d1 = LocalDate.of(2025, 1, 1);
LocalDate d2 = d1.plusDays(1);

System.out.println(d1); // 2025-01-01
System.out.println(d2); // 2025-01-02
Java

plusDays(1) を呼んでも、d1 は変わりません
「元のオブジェクトを書き換える」のではなく、「新しい LocalDate を返す」だけです。

この性質のおかげで、

  • 他のメソッドに渡しても、勝手に書き換えられない
  • マルチスレッドでも「データ競合で値が変わる」ことがない

という、非常に安心な設計になっています。

Date のように setTime で書き換えられてしまう事故を気にしなくていいのは、かなり大きなメリットです。


日付の加算・減算・比較(よく使う操作)

日付の加算・減算(plusXxx / minusXxx)

「1 日後」「1 週間後」「1 か月前」などは、メソッドで素直に書けます。

LocalDate date = LocalDate.of(2025, 1, 10);

LocalDate plusDays    = date.plusDays(3);     // 3日後 → 2025-01-13
LocalDate minusDays   = date.minusDays(5);    // 5日前 → 2025-01-05
LocalDate plusWeeks   = date.plusWeeks(2);    // 2週間後 → 2025-01-24
LocalDate plusMonths  = date.plusMonths(1);   // 1か月後 → 2025-02-10
LocalDate plusYears   = date.plusYears(1);    // 1年後 → 2026-01-10
Java

年月の端(31 日が無い月など)は、カレンダーのルールに沿ってうまく調整してくれます。

日付の比較(isBefore / isAfter / equals)

LocalDate d1 = LocalDate.of(2025, 1, 10);
LocalDate d2 = LocalDate.of(2025, 1, 20);

boolean b1 = d1.isBefore(d2); // true
boolean b2 = d1.isAfter(d2);  // false
boolean b3 = d1.equals(d2);   // false
Java

「d1 が d2 より前か?」「後か?」を読むように書けるので、
compareTo よりも直感的です。

ビジネスロジックでの利用(締切前かどうか、期間内かどうかなど)で非常に読みやすい条件が書けます。


曜日・月末など、よくある実務的な取り回し

曜日の取得

LocalDate date = LocalDate.of(2025, 1, 10);

System.out.println(date.getDayOfWeek());        // FRIDAY
System.out.println(date.getDayOfWeek().getValue()); // 5(ISO で月=1, 日=7)  [docs.oracle.com](https://docs.oracle.com/javase/jp/23/docs/api/java.base/java/time/LocalDate.html)
Java

getDayOfWeek()DayOfWeek enum(MONDAY〜SUNDAY)を返します。
日本語表示にしたいときは、自前で変換テーブルを書くか、DateTimeFormatter を組み合わせます。

月初/月末の日付を求める

import java.time.temporal.TemporalAdjusters;

LocalDate d = LocalDate.of(2025, 2, 15);

LocalDate first = d.with(TemporalAdjusters.firstDayOfMonth()); // 2025-02-01
LocalDate last  = d.with(TemporalAdjusters.lastDayOfMonth());  // 2025-02-28
Java

「月初」「月末」などの調整は TemporalAdjusters に用意されています。
Excel でよくやるような“月末締め”の計算を、かなり素直に書けます。


文字列との相互変換(フォーマット/パース)の基本

LocalDate → 文字列(format)

日付を表示用文字列にしたい場合は、DateTimeFormatter を使います。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class LocalDateFormat {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 1, 10);

        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        String s = date.format(fmt);

        System.out.println(s); // 2025/01/10
    }
}
Java

java.time のフォーマッタは スレッドセーフ なので、
SimpleDateFormat のような「マルチスレッドで壊れる」心配がありません。

文字列 → LocalDate(parse)

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class LocalDateParse {
    public static void main(String[] args) {
        String text = "2025-01-10";

        LocalDate d1 = LocalDate.parse(text); // ISO 形式(yyyy-MM-dd)はそのまま parse 可能

        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        LocalDate d2 = LocalDate.parse("2025/01/10", fmt);

        System.out.println(d1); // 2025-01-10
        System.out.println(d2); // 2025-01-10
    }
}
Java

ISO 形式(yyyy-MM-dd)なら LocalDate.parse("2025-01-10") だけでいけますし、
カスタム形式なら DateTimeFormatter を渡せばOKです。


Date と LocalDate をどう使い分けるか(ここを理解すると一段レベルが上がる)

LocalDate が得意なもの

LocalDate は、

  • 誕生日、記念日、祝日
  • 営業日、締切日、請求日
  • 「日付だけ分かればいい」情報

といった、「時刻やタイムゾーンを気にしない“その日”」に最適です。

不変で、安全で、API も直感的なので、
Java 8 以降の新規コードでは まず LocalDate を使うのが基本 と考えてよいです。

Date / LocalDateTime / ZonedDateTime とのざっくりした棲み分け

用途ごとにざっと整理すると:

  • 「日付だけ」 → LocalDate
  • 「日付+時刻(ローカル時間でいい)」 → LocalDateTime
  • 「日付+時刻+タイムゾーン」 → ZonedDateTime
  • 「UTC 基準の“瞬間”(ミリ秒や秒ベース)」 → Instant
  • 「古い API とだけ話す必要がある」 → 外部境界でだけ Date を使い、中では LocalDate / LocalDateTime に変換

既存のライブラリや DB ドライバが Date を要求する場合も、
「境界で Date ⇔ LocalDate に変換して、内部は java.time で統一」が定番パターンです。


まとめ:LocalDate を自分の中でこう位置づける

LocalDate を初心者向けにまとめると:

  • タイムゾーンも時刻も持たない、「純粋な日付(年・月・日)」のクラス
  • 不変(immutable)なので、勝手に書き換えられず安全
  • now, of, plusDays, isBefore など、自然な名前のメソッドで日付計算・比較が書ける
  • DateTimeFormatter と組み合わせて、スレッドセーフにフォーマット/パースできる
  • 「日付だけで十分」な場面では、古い Date より圧倒的に使いやすく、バグも減る

タイトルとURLをコピーしました