LocalDate をざっくり一言でいうと
LocalDate は、
「タイムゾーンも時刻も持たない、“純粋な日付(年・月・日だけ)”」
をあつかうためのクラスです。
誕生日、締切日、営業日、請求日など、
「その日」が分かればよくて「何時か」はいらない場面にピッタリです。
Date のようにミリ秒やタイムゾーンを意識する必要はなく、
「2025 年 12 月 25 日」という“日付そのもの”だけを安全に持てます。
LocalDate の基本イメージと生成
「今日」「特定の日付」を作る
LocalDate は java.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
JavagetMonth() だと 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
JavaplusDays(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)
JavagetDayOfWeek() は 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
}
}
Javajava.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
}
}
JavaISO 形式(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より圧倒的に使いやすく、バグも減る

