Java Tips | 日付・時間:LocalDate生成

Java Java
スポンサーリンク

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 のデフォルトタイムゾーンが日本なら、日本時間の“今日”になります。

もし「特定のタイムゾーンの今日」が欲しいなら、
ClockZoneId を使って明示的に指定します。

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 付き)。
「どこから来た日付か」「どのタイムゾーン基準か」を意識して名前や生成方法を選ぶ。

あなたのコードのどこかに、
DateCalendar を使って「年・月・日だけ」を無理やり扱っている箇所があれば、
そこを一度「LocalDate 生成」に置き換えられないか眺めてみてください。

それが、「日付・時間を意図どおりに設計できるエンジニア」への、
いい一歩になります。

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