LocalDate は「日付だけ」を扱うクラス
LocalDate は、「年月日だけ」を扱うクラスです。
時刻(時分秒)もタイムゾーンも持ちません。
「請求日」「締切日」「誕生日」「営業日」など、
“日付だけ分かればいい”ものを扱うときに使います。
java.time パッケージ(Java 8 以降)の一員で、
古い java.util.Date よりもずっと分かりやすく、安全に扱えます。
ここでは、業務でよく使う「LocalDate の生成パターン」を、
初心者向けにかみ砕いて整理していきます。
今日の日付を生成する:LocalDate.now()
「今この瞬間の“日付”」が欲しいとき
一番よく使うのが LocalDate.now() です。
import java.time.LocalDate;
public class TodayExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println(today); // 例: 2025-03-26
}
}
Javaここでのポイントは、「“今”の“日付部分だけ”を切り出している」ということです。
内部的にはシステムの時計とタイムゾーンを見て、
「今日が何年何月何日か」を計算してくれます。
業務では、例えばこんな用途があります。
請求書の発行日を「今日」にする。
バッチ処理で「今日の日付のデータだけ処理する」。
「今日が締切を過ぎているか」を判定する。
「とりあえず今日の日付が欲しい」と思ったら、まず LocalDate.now() を思い出してください。
年月日を指定して生成する:LocalDate.of(年, 月, 日)
「特定の日付」をコードでハッキリ書きたいとき
「2025年3月31日」のように、
特定の日付をはっきり指定したいときは LocalDate.of を使います。
import java.time.LocalDate;
public class OfExample {
public static void main(String[] args) {
LocalDate closingDate = LocalDate.of(2025, 3, 31);
System.out.println(closingDate); // 2025-03-31
}
}
Javaここでの重要ポイントは二つです。
一つ目は、「月は 1〜12 をそのまま指定する」ということです。Calendar のように「0 が1月」ではありません。LocalDate.of(2025, 3, 31) は素直に「2025年3月31日」です。
二つ目は、「存在しない日付を指定すると例外になる」ということです。
LocalDate bad = LocalDate.of(2025, 2, 30); // DateTimeException
Javaこれにより、「ありえない日付」が紛れ込むのを早い段階で防げます。
「締切日を固定で決めておく」「期首・期末日を定数で持つ」など、
“意味のある日付”をコードに埋め込むときにとても便利です。
文字列から生成する:LocalDate.parse(文字列)
「yyyy-MM-dd 形式の文字列」を LocalDate に変換する
外部から受け取った文字列(設定ファイル、CSV、API など)をLocalDate に変換したい場面も多いです。
一番基本の形は、ISO形式(yyyy-MM-dd)の文字列を parse する方法です。
import java.time.LocalDate;
public class ParseExample {
public static void main(String[] args) {
LocalDate date = LocalDate.parse("2025-03-26");
System.out.println(date); // 2025-03-26
}
}
Javaここでのポイントは、「フォーマットが決まっている」ということです。LocalDate.parse のデフォルトは、"2025-03-26" のような ISO 形式だけを受け付けます。
もし "2025/03/26" のような別形式を扱いたい場合は、DateTimeFormatter を使います。
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class ParseWithFormatterExample {
public static void main(String[] args) {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date = LocalDate.parse("2025/03/26", fmt);
System.out.println(date); // 2025-03-26
}
}
Java業務では、
「DB に文字列で入っている日付を LocalDate に変換する」
「CSV の日付列を LocalDate に変換する」
といった場面で頻出します。
LocalDate 生成の“文脈”を意識する
「どこから来た日付か」をハッキリさせる
LocalDate を生成するときに、
「この日付はどこから来たのか?」を意識しておくと、
後からコードを読む人にとって理解しやすくなります。
例えば、次のような違いがあります。
LocalDate.now()
→ 「システム時計から見た“今日”」
LocalDate.of(2025, 4, 1)
→ 「ビジネス上の意味を持つ固定日(期首など)」
LocalDate.parse(str, formatter)
→ 「外部から渡された文字列を解釈した日付」
これらを混ぜて使うときは、
変数名やメソッド名で「由来」を表現しておくとよいです。
例:
LocalDate today = LocalDate.now();
LocalDate termStartDate = LocalDate.of(2025, 4, 1);
LocalDate inputDate = LocalDate.parse(input, formatter);
Java「どこから来た日付か」が分かるだけで、
バグ調査や仕様変更のときのストレスがかなり減ります。
LocalDate 生成とタイムゾーンの関係
「LocalDate 自体はタイムゾーンを持たない」が、生成元は持っている
LocalDate はタイムゾーンを持ちません。
「2025-03-26」という“日付”だけです。
ただし、LocalDate.now() は内部で「どのタイムゾーンか」を見ています。
JVM のデフォルトタイムゾーンが日本なら、日本時間の“今日”になります。
もし「特定のタイムゾーンの今日」が欲しいなら、Clock や ZoneId を使って明示的に指定します。
import java.time.*;
public class ZonedTodayExample {
public static void main(String[] args) {
ZoneId tokyo = ZoneId.of("Asia/Tokyo");
LocalDate todayInTokyo = LocalDate.now(tokyo);
ZoneId utc = ZoneId.of("UTC");
LocalDate todayInUtc = LocalDate.now(utc);
System.out.println("Tokyo: " + todayInTokyo);
System.out.println("UTC : " + todayInUtc);
}
}
Java業務では、
「システムは UTC で動いているが、ビジネスロジックは日本時間で考える」
といったケースがよくあります。
そのときは、
「どのタイムゾーン基準の LocalDate なのか」を意識して生成することが大事です。
まとめ:LocalDate生成で身につけてほしい感覚
LocalDate は、
「日付だけを安全に扱うための、今どきの標準ツール」です。
今日の日付が欲しいなら LocalDate.now()。
特定の日付をコードに書きたいなら LocalDate.of(年, 月, 日)。
文字列から変換したいなら LocalDate.parse(必要なら DateTimeFormatter 付き)。
「どこから来た日付か」「どのタイムゾーン基準か」を意識して名前や生成方法を選ぶ。
あなたのコードのどこかに、Date や Calendar を使って「年・月・日だけ」を無理やり扱っている箇所があれば、
そこを一度「LocalDate 生成」に置き換えられないか眺めてみてください。
それが、「日付・時間を意図どおりに設計できるエンジニア」への、
いい一歩になります。

