カテゴリ: Java 更新日: 2026/04/09

Java LocalDateTimeの使い方|日時生成・操作・フォーマットを丁寧に解説

Java LocalDateTimeの使い方|日時生成・操作・フォーマットを丁寧に解説
Java LocalDateTimeの使い方|日時生成・操作・フォーマットを丁寧に解説

先生と生徒の会話形式で理解しよう

生徒

「Javaで日付と時刻を両方扱いたいんですが、どうすればいいですか?」

先生

「Javaでは、LocalDateTimeクラスを使って、日付と時刻を一緒に扱うことができます。Java 8から導入された新しい日時APIの一部で、とても便利ですよ。」

生徒

「LocalDateTimeって、どんな場面で使うんですか?」

先生

「例えば、予約システムで予約日時を記録したり、ログファイルにタイムスタンプを記録したりする場面で使います。それでは、基本的な使い方から見ていきましょう!」

1. LocalDateTimeクラスとは

1. LocalDateTimeクラスとは
1. LocalDateTimeクラスとは

JavaのLocalDateTimeクラスは、日付と時刻を組み合わせて扱うためのクラスです。java.timeパッケージに含まれており、タイムゾーン情報を持たないローカルな日時を表現します。年月日と時分秒の情報を持ち、ナノ秒まで精度があります。

LocalDateTimeは、イミュータブル(不変)なオブジェクトであるため、一度作成すると変更できません。日時を変更する操作を行うと、新しいLocalDateTimeオブジェクトが返されます。これにより、スレッドセーフで安全なプログラミングが可能になります。

2. LocalDateTimeの基本的な生成方法

2. LocalDateTimeの基本的な生成方法
2. LocalDateTimeの基本的な生成方法

LocalDateTimeオブジェクトを生成する方法はいくつかあります。現在の日時を取得する方法、特定の日時を指定する方法、そして他の日時オブジェクトから変換する方法などがあります。

最も基本的な生成方法は、now()メソッドを使って現在の日時を取得する方法です。また、of()メソッドを使えば、年月日と時分秒を指定して任意の日時を作成できます。


import java.time.LocalDateTime;

public class LocalDateTimeBasic {
    public static void main(String[] args) {
        // 現在の日時を取得
        LocalDateTime now = LocalDateTime.now();
        System.out.println("現在の日時: " + now);
        
        // 特定の日時を指定して生成
        LocalDateTime specificDateTime = LocalDateTime.of(2024, 12, 25, 15, 30, 45);
        System.out.println("指定した日時: " + specificDateTime);
        
        // 年月日と時分を指定(秒は0になる)
        LocalDateTime simpleDateTime = LocalDateTime.of(2024, 6, 1, 10, 0);
        System.out.println("簡易指定: " + simpleDateTime);
    }
}

実行結果は以下のようになります。


現在の日時: 2024-11-15T14:23:56.789123456
指定した日時: 2024-12-25T15:30:45
簡易指定: 2024-06-01T10:00

このように、LocalDateTimeは柔軟に日時を生成できます。現在時刻の取得はnow()メソッド一つで完結し、特定の日時はof()メソッドで自由に設定できます。

3. LocalDateTimeから日付・時刻情報を取得する方法

3. LocalDateTimeから日付・時刻情報を取得する方法
3. LocalDateTimeから日付・時刻情報を取得する方法

LocalDateTimeオブジェクトから、年月日や時分秒などの個別の情報を取得することができます。それぞれの要素に対応したgetterメソッドが用意されています。

年を取得するにはgetYear()、月を取得するにはgetMonthValue()またはgetMonth()を使います。日、時、分、秒、ナノ秒についても同様のメソッドが用意されています。


import java.time.LocalDateTime;
import java.time.Month;

public class GetDateTimeInfo {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.of(2024, 7, 20, 14, 30, 45);
        
        // 各要素を個別に取得
        int year = dateTime.getYear();
        int month = dateTime.getMonthValue();
        int day = dateTime.getDayOfMonth();
        int hour = dateTime.getHour();
        int minute = dateTime.getMinute();
        int second = dateTime.getSecond();
        
        System.out.println("年: " + year);
        System.out.println("月: " + month);
        System.out.println("日: " + day);
        System.out.println("時: " + hour);
        System.out.println("分: " + minute);
        System.out.println("秒: " + second);
        
        // 曜日や年の通算日も取得可能
        System.out.println("曜日: " + dateTime.getDayOfWeek());
        System.out.println("年の通算日: " + dateTime.getDayOfYear());
    }
}

実行結果は以下のようになります。


年: 2024
月: 7
日: 20
時: 14
分: 30
秒: 45
曜日: SATURDAY
年の通算日: 202

このように、LocalDateTimeから必要な情報を簡単に取り出すことができます。曜日や年の通算日なども取得できるため、カレンダーアプリケーションの開発にも便利です。

4. LocalDateTimeの日時操作メソッド

4. LocalDateTimeの日時操作メソッド
4. LocalDateTimeの日時操作メソッド

LocalDateTimeには、日時を加算・減算するための便利なメソッドが多数用意されています。年月日や時分秒を個別に増減させることができ、柔軟な日時計算が可能です。

plusXxx()メソッドで加算、minusXxx()メソッドで減算を行います。例えば、plusDays()で日数を加算、minusHours()で時間を減算できます。


import java.time.LocalDateTime;

public class DateTimeManipulation {
    public static void main(String[] args) {
        LocalDateTime baseDateTime = LocalDateTime.of(2024, 6, 15, 10, 30, 0);
        System.out.println("基準日時: " + baseDateTime);
        
        // 日時の加算
        LocalDateTime plusDays = baseDateTime.plusDays(7);
        System.out.println("7日後: " + plusDays);
        
        LocalDateTime plusHours = baseDateTime.plusHours(3);
        System.out.println("3時間後: " + plusHours);
        
        // 日時の減算
        LocalDateTime minusMonths = baseDateTime.minusMonths(2);
        System.out.println("2ヶ月前: " + minusMonths);
        
        LocalDateTime minusMinutes = baseDateTime.minusMinutes(45);
        System.out.println("45分前: " + minusMinutes);
        
        // 複数の操作を連鎖
        LocalDateTime complex = baseDateTime.plusWeeks(2).minusDays(3).plusHours(5);
        System.out.println("複雑な計算: " + complex);
    }
}

実行結果は以下のようになります。


基準日時: 2024-06-15T10:30
7日後: 2024-06-22T10:30
3時間後: 2024-06-15T13:30
2ヶ月前: 2024-04-15T10:30
45分前: 2024-06-15T09:45
複雑な計算: 2024-06-26T15:30

これらのメソッドは、予約システムで予約時刻の計算をしたり、スケジュール管理で期限を計算したりする際に非常に便利です。メソッドチェーンを使って複数の操作を連続して行うこともできます。

5. LocalDateTimeのフォーマット変換

5. LocalDateTimeのフォーマット変換
5. LocalDateTimeのフォーマット変換

LocalDateTimeを文字列に変換する際には、DateTimeFormatterクラスを使用します。これにより、好きな形式で日時を表示することができます。日本語での表示や、システムで使用する標準形式など、様々な用途に対応できます。

DateTimeFormatterには、あらかじめ定義された標準フォーマットがいくつか用意されていますが、ofPattern()メソッドを使って独自のフォーマットを定義することもできます。


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

public class DateTimeFormatting {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.of(2024, 8, 10, 15, 45, 30);
        
        // 標準フォーマット
        String isoFormat = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        System.out.println("ISO形式: " + isoFormat);
        
        // カスタムフォーマット
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒");
        String japaneseFormat = dateTime.format(formatter1);
        System.out.println("日本語形式: " + japaneseFormat);
        
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        String slashFormat = dateTime.format(formatter2);
        System.out.println("スラッシュ形式: " + slashFormat);
        
        DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm a");
        String usFormat = dateTime.format(formatter3);
        System.out.println("米国形式: " + usFormat);
    }
}

実行結果は以下のようになります。


ISO形式: 2024-08-10T15:45:30
日本語形式: 2024年08月10日 15時45分30秒
スラッシュ形式: 2024/08/10 15:45:30
米国形式: 08-10-2024 03:45 PM

フォーマットパターンは非常に柔軟で、年を表すyyyy、月を表すMM、日を表すddなどの記号を組み合わせて、任意の形式を作成できます。ログファイルやレポート出力など、用途に応じた形式で日時を表示することができます。

6. 文字列からLocalDateTimeへの変換

6. 文字列からLocalDateTimeへの変換
6. 文字列からLocalDateTimeへの変換

文字列で表現された日時をLocalDateTimeオブジェクトに変換することもできます。parse()メソッドを使用し、DateTimeFormatterで形式を指定します。外部システムからデータを受け取る際や、ユーザー入力を処理する際に便利です。

標準的なISO形式の文字列であれば、フォーマッターを指定せずに直接パースできます。独自形式の文字列をパースする場合は、その形式に対応したDateTimeFormatterを作成して指定します。

基本的なパース処理のサンプルコードを見てみましょう。


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

public class ParseDateTime {
    public static void main(String[] args) {
        // ISO形式の文字列をパース
        String isoString = "2024-09-20T13:30:00";
        LocalDateTime dateTime1 = LocalDateTime.parse(isoString);
        System.out.println("パース結果1: " + dateTime1);
        
        // カスタム形式の文字列をパース
        String customString = "2024年10月05日 18時30分00秒";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒");
        LocalDateTime dateTime2 = LocalDateTime.parse(customString, formatter);
        System.out.println("パース結果2: " + dateTime2);
        
        // エラーハンドリングの例
        try {
            String invalidString = "2024/13/45 25:99:99";
            LocalDateTime dateTime3 = LocalDateTime.parse(invalidString);
        } catch (DateTimeParseException e) {
            System.out.println("パースエラー: 無効な日時形式です");
        }
    }
}

実行結果は以下のようになります。


パース結果1: 2024-09-20T13:30
パース結果2: 2024-10-05T18:30
パースエラー: 無効な日時形式です

7. LocalDateTimeの比較操作

7. LocalDateTimeの比較操作
7. LocalDateTimeの比較操作

二つのLocalDateTimeオブジェクトを比較する方法もいくつか用意されています。日時の前後関係を判定したり、同じ日時かどうかを確認したりすることができます。

isBefore()メソッドで指定した日時より前かを判定し、isAfter()メソッドで後かを判定します。また、isEqual()メソッドで同じ日時かを確認できます。予約システムや期限管理など、日時の比較が必要な場面で活用できます。

比較メソッドを使った実装例を見てみましょう。


import java.time.LocalDateTime;

public class CompareDateTimes {
    public static void main(String[] args) {
        LocalDateTime dateTime1 = LocalDateTime.of(2024, 5, 15, 10, 0, 0);
        LocalDateTime dateTime2 = LocalDateTime.of(2024, 8, 20, 14, 30, 0);
        LocalDateTime dateTime3 = LocalDateTime.of(2024, 5, 15, 10, 0, 0);
        
        System.out.println("dateTime1: " + dateTime1);
        System.out.println("dateTime2: " + dateTime2);
        
        // 前後の比較
        boolean isBefore = dateTime1.isBefore(dateTime2);
        System.out.println("dateTime1はdateTime2より前: " + isBefore);
        
        boolean isAfter = dateTime1.isAfter(dateTime2);
        System.out.println("dateTime1はdateTime2より後: " + isAfter);
        
        // 同一性の確認
        boolean isEqual = dateTime1.isEqual(dateTime3);
        System.out.println("dateTime1とdateTime3は同じ: " + isEqual);
        
        // 現在時刻との比較
        LocalDateTime now = LocalDateTime.now();
        if (dateTime2.isAfter(now)) {
            System.out.println("dateTime2は未来の日時です");
        } else {
            System.out.println("dateTime2は過去の日時です");
        }
    }
}

これらの比較メソッドを使うことで、期限切れのチェックや、イベントの開始判定など、様々な日時関連の条件分岐を簡潔に記述できます。

8. LocalDateとLocalTimeとの相互変換

8. LocalDateとLocalTimeとの相互変換
8. LocalDateとLocalTimeとの相互変換

LocalDateTimeは、LocalDateとLocalTimeに分離したり、逆にこれらを組み合わせて生成したりすることができます。日付だけ、または時刻だけを扱いたい場合に便利です。

toLocalDate()メソッドで日付部分を、toLocalTime()メソッドで時刻部分を取得できます。また、LocalDateとLocalTimeをatTime()atDate()メソッドで結合してLocalDateTimeを作成することもできます。

このような日付と時刻の分離・結合は、日付のみでソートしたい場合や、時刻のみを比較したい場合に役立ちます。データベースに日付と時刻を別々のカラムで保存している場合にも、これらのメソッドが活用できます。

9. LocalDateTimeの実践的な活用例

9. LocalDateTimeの実践的な活用例
9. LocalDateTimeの実践的な活用例

LocalDateTimeは実際のアプリケーション開発で様々な場面で活用されます。予約システム、スケジュール管理、ログ記録、期限管理など、日時を扱う機能には欠かせない存在です。

例えば、会議室の予約システムでは、予約開始時刻と終了時刻をLocalDateTimeで管理し、予約の重複チェックや空き時間の検索などを行います。また、タスク管理システムでは、タスクの作成日時、期限、完了日時などをLocalDateTimeで記録します。

ログファイルへのタイムスタンプ記録も重要な用途の一つです。システムのエラーログやアクセスログに正確な日時を記録することで、問題の原因究明や分析が容易になります。LocalDateTimeのフォーマット機能を使えば、ログの可読性も向上します。

さらに、Webアプリケーションでは、ユーザーの投稿日時やコメントの投稿時刻を記録する際にもLocalDateTimeが使われます。データベースとのやり取りでは、JDBC経由でTimestamp型との相互変換も可能です。

10. LocalDateTimeを使う際の注意点とベストプラクティス

10. LocalDateTimeを使う際の注意点とベストプラクティス
10. LocalDateTimeを使う際の注意点とベストプラクティス

LocalDateTimeを使う際には、いくつかの重要な注意点があります。まず、LocalDateTimeはタイムゾーン情報を持たないため、異なるタイムゾーンをまたぐ処理では注意が必要です。国際的なアプリケーションを開発する場合は、ZonedDateTimeやInstantの使用を検討しましょう。

また、LocalDateTimeはイミュータブルなオブジェクトなので、日時を変更する操作を行った後は、必ず返り値を受け取る必要があります。元のオブジェクトは変更されないため、返り値を無視すると意図した動作になりません。

データベースに保存する際は、データベースの日時型との互換性を確認することも大切です。多くのデータベースでは、TIMESTAMP型やDATETIME型との変換がサポートされています。ORMフレームワークを使用する場合は、適切なマッピング設定を行いましょう。

パフォーマンスの観点では、頻繁にフォーマット変換を行う場合は、DateTimeFormatterを再利用することが推奨されます。DateTimeFormatterはスレッドセーフなので、定数として定義して使い回すことができます。

テストコードを書く際は、現在時刻に依存する処理のテストが難しくなることがあります。このような場合は、Clock抽象化を使用して、テスト時に固定の時刻を返すようにするなどの工夫が有効です。

カテゴリの一覧へ
新着記事
New1
Micronaut
Micronautの@Requiresとは?条件付きBeanの読み込み方法をやさしく解説【DIとアノテーション入門】
New2
Quarkus
QuarkusとgRPC連携ガイド!超高速なマイクロサービス開発の始め方
New3
Quarkus
Quarkusでマイクロサービス構成を作るプロジェクト設計を完全解説!初心者でも理解できる分割設計の考え方
New4
Quarkus
QuarkusのREST API入門!エンドポイント作成を@Path・@GET・@POSTから基礎解説
人気記事
No.1
Java&Spring記事人気No1
Java
Javaの配列とは?基本の使い方・宣言・初期化を初心者向けにわかりやすく解説
No.2
Java&Spring記事人気No2
Java
Java ArrayListの使い方完全ガイド|追加・削除・取得・検索の基本操作
No.3
Java&Spring記事人気No3
Quarkus
Quarkus拡張開発を徹底解説!仕組みから自作エクステンションの作り方まで
No.4
Java&Spring記事人気No4
Java
Javaの配列検索を完全攻略!値の探し方や多次元配列の条件一致を解説
No.5
Java&Spring記事人気No5
Java
Javaの型変換(キャスト)を徹底解説!暗黙的・明示的変換の違いを整理
No.6
Java&Spring記事人気No6
Micronaut
Micronautでリクエストを受け取る方法!@Getと@PathVariableの基礎を初心者向けに徹底解説
No.7
Java&Spring記事人気No7
Micronaut
Micronautで非同期HTTP処理を行う方法!リアクティブ対応の基礎知識
No.8
Java&Spring記事人気No8
Quarkus
Quarkus拡張開発をマスター!ビルドプロセスの仕組みと内部構造を徹底解説