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

Java Java
スポンサーリンク

LocalDateTime は「日付+時刻」をまとめて扱うクラス

LocalDateTime は、「年月日」と「時分秒(ナノ秒まで)」を一つにまとめて扱うクラスです。
タイムゾーンは持たないので、「ある地域のローカルな日時」を表現するのに向いています。

「ログイン日時」「注文日時」「バッチの実行日時」など、
“いつ”起きたかを日付と時刻セットで扱いたい場面でよく使われます。
古い DateCalendar より直感的で、値は不変(immutable)なので安全に扱えます。


現在日時を生成する:LocalDateTime.now()

一番シンプルな「今この瞬間の日時」

最も基本的な生成方法は LocalDateTime.now() です。

import java.time.LocalDateTime;

public class NowExample {

    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now); // 例: 2025-09-04T15:20:30.123
    }
}
Java

ここで重要なのは、「システムのデフォルトタイムゾーンを基準にした“今”のローカル日時」を取っている、という点です。
出力の T は「日付と時刻の区切り」で、ISO-8601 形式の標準表現です。

業務では、ログのタイムスタンプ、レコードの作成日時・更新日時、ユーザー操作の記録など、「とにかく今の日時を残したい」場面でほぼ必ず登場します。

テストしやすい now の書き方(Clock 利用)

ビジネスロジックの中で LocalDateTime.now() を直接呼ぶと、テストで「時間を固定したい」ときに困ることがあります。

その場合は Clock を使って、こう書き換えるとテストしやすくなります。

import java.time.Clock;
import java.time.LocalDateTime;
import java.time.ZoneId;

public class ClockExample {

    public static void main(String[] args) {
        Clock clock = Clock.system(ZoneId.of("Asia/Tokyo"));
        LocalDateTime now = LocalDateTime.now(clock);
        System.out.println(now);
    }
}
Java

「本番ではシステム時計」「テストでは固定時刻の Clock」というように差し替えられるので、
「朝だけ動く処理」「締切前後で挙動が変わる処理」などのテストが安定します。


特定の日時を生成する:LocalDateTime.of(…)

年月日と時分秒を指定して作る

「2025年1月1日 9時0分」のような、意味のある日時をコードに埋め込みたいときは of を使います。

import java.time.LocalDateTime;

public class OfExample {

    public static void main(String[] args) {
        LocalDateTime dt1 = LocalDateTime.of(2025, 1, 1, 9, 0);
        LocalDateTime dt2 = LocalDateTime.of(2025, 3, 31, 23, 59, 59);

        System.out.println(dt1); // 2025-01-01T09:00
        System.out.println(dt2); // 2025-03-31T23:59:59
    }
}
Java

ここで深掘りしたいポイントは二つです。

一つ目は、「月は 1〜12 をそのまま指定する」ということです。
Calendar のように「0 が1月」ではありません。
LocalDateTime.of(2025, 3, 31, 23, 59) は素直に「2025年3月31日 23:59」です。

二つ目は、「存在しない日時を指定すると例外になる」ということです。

LocalDateTime bad = LocalDateTime.of(2025, 2, 30, 10, 0); // DateTimeException
Java

これにより、「ありえない日付・時刻」が紛れ込むのを早い段階で防げます。
「期首・期末」「締切日時」「サービス開始日時」など、ビジネス上意味のある日時を定数として持つときにとても役立ちます。

LocalDate と LocalTime から合成する

すでに LocalDateLocalTime がある場合、それらを組み合わせて LocalDateTime を作ることもできます。

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class CombineExample {

    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 4, 1);
        LocalTime time = LocalTime.of(9, 0);

        LocalDateTime dateTime = LocalDateTime.of(date, time);
        System.out.println(dateTime); // 2025-04-01T09:00
    }
}
Java

「日付は別ロジックで決まる」「時刻は設定値から読む」といったケースで、
最後に LocalDateTime にまとめる、という設計がきれいに書けます。


文字列から生成する:LocalDateTime.parse(…)

ISO 形式の文字列をそのまま parse する

外部から "2025-09-04T15:20:30" のような文字列で日時を受け取ることがあります。
この場合は LocalDateTime.parse でそのまま変換できます。

import java.time.LocalDateTime;

public class ParseExample {

    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.parse("2025-09-04T15:20:30");
        System.out.println(dt); // 2025-09-04T15:20:30
    }
}
Java

フォーマットは ISO-8601(yyyy-MM-dd'T'HH:mm:ss)が前提です。
API や設定ファイルをこの形式に揃えておくと、変換コードが非常にシンプルになります。

独自フォーマットの文字列を parse する

"2025/09/04 15:20:30" のような独自形式を扱う場合は、DateTimeFormatter を使います。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class ParseWithFormatterExample {

    public static void main(String[] args) {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        LocalDateTime dt = LocalDateTime.parse("2025/09/04 15:20:30", fmt);
        System.out.println(dt); // 2025-09-04T15:20:30
    }
}
Java

CSV や設定ファイル、画面入力など、
「人間にとって読みやすい形式」と「プログラム内部の LocalDateTime」をつなぐ橋渡しとして、
DateTimeFormatter は必須の道具になります。


LocalDateTime 生成とタイムゾーンの考え方

LocalDateTime 自体はタイムゾーンを持たない

LocalDateTime は、「年・月・日・時・分・秒・ナノ秒」だけを持ち、タイムゾーンは持ちません。
つまり、「2025-09-04T15:20:30」という“壁掛け時計的な日時”を表しているだけです。

「世界のどの瞬間か(UTC で何時か)」を扱いたい場合は、
ZonedDateTimeOffsetDateTime と組み合わせて使います。

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class ZonedExample {

    public static void main(String[] args) {
        LocalDateTime local = LocalDateTime.of(2025, 9, 4, 15, 20, 30);
        ZonedDateTime tokyo = local.atZone(ZoneId.of("Asia/Tokyo"));
        System.out.println(tokyo); // 2025-09-04T15:20:30+09:00[Asia/Tokyo]
    }
}
Java

「業務ロジックは LocalDateTime」「外部システムとのやり取りや保存時は Zoned/Offset」
という役割分担を意識しておくと、設計がぶれにくくなります。


まとめ:LocalDateTime生成で押さえておきたい感覚

LocalDateTime は、「日付+時刻」を一つの値として扱うための、今どきの標準クラスです。

現在日時なら LocalDateTime.now()(テストしやすくしたいなら Clock 付き)。
固定の日時なら LocalDateTime.of(...)、あるいは LocalDateLocalTime から合成。
文字列からなら LocalDateTime.parseDateTimeFormatter
タイムゾーンは持たないので、「ローカルな日時」として割り切り、必要に応じて ZonedDateTime などに変換する。

あなたのコードの中で、「Date による日時管理」や「文字列のまま日時を持っている」箇所があれば、
そこを一度「LocalDateTime 生成」に置き換えられないか眺めてみてください。
それが、日付・時間を意図どおりに設計できるエンジニアへの、いい一歩になります。

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