LocalDateTimeクラスを新人エンジニアに解説

こんにちは。ゆうせいです。
今回は、JavaのLocalDateTimeクラスについて解説します!
LocalDateTimeは、日付(年月日)と時間(時分秒)を組み合わせた日時を操作するためのクラスで、Java 8以降に導入された新しい日時APIの一部です。


LocalDateTimeとは?

LocalDateTimeは、日付(LocalDate)と時間(LocalTime)を組み合わせたクラスで、タイムゾーンを考慮せずに日時を管理できます。不変(immutable)でスレッドセーフなので、簡単かつ安全に使えます。

例えるなら…

LocalDateTimeは、「日時を管理するシンプルなスケジュール帳」のようなものです。例えば、「2025年1月1日 10時30分」のような日時を操作できます。


LocalDateTimeの基本的な使い方

1. LocalDateTimeオブジェクトの作成

現在の日時を取得

LocalDateTime.now()で現在の日時を取得できます。

import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now();
System.out.println("現在の日時: " + now);

特定の日時を生成

LocalDateTime.of()メソッドで指定した日時を生成します。

LocalDateTime specificDateTime = LocalDateTime.of(2025, 1, 1, 10, 30, 0);
System.out.println("指定した日時: " + specificDateTime);

文字列から日時を生成

LocalDateTime.parse()を使うと、文字列を日時に変換できます。

LocalDateTime parsedDateTime = LocalDateTime.parse("2025-01-01T10:30:00");
System.out.println("パースした日時: " + parsedDateTime);


2. 年月日・時間の取得

日時の各要素を取得できます。

int year = now.getYear();          // 年
int month = now.getMonthValue();   // 月(数値)
int day = now.getDayOfMonth();     // 日
int hour = now.getHour();          // 時
int minute = now.getMinute();      // 分
int second = now.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("曜日: " + now.getDayOfWeek()); // 曜日(MONDAY, TUESDAYなど)


3. 日時の操作

LocalDateTimeは日付や時間を簡単に加算・減算できます。

日時を加算

LocalDateTime nextWeek = now.plusWeeks(1);  // 1週間後
LocalDateTime nextHour = now.plusHours(1);  // 1時間後

System.out.println("1週間後: " + nextWeek);
System.out.println("1時間後: " + nextHour);

日時を減算

LocalDateTime lastMonth = now.minusMonths(1); // 1か月前
LocalDateTime lastDay = now.minusDays(1);     // 1日前

System.out.println("1か月前: " + lastMonth);
System.out.println("1日前: " + lastDay);


4. 日時の比較

日時を比較するには、isBefore()isAfter(), equals()を使用します。

LocalDateTime dateTime1 = LocalDateTime.of(2025, 1, 1, 10, 30);
LocalDateTime dateTime2 = LocalDateTime.of(2025, 12, 31, 23, 59);

if (dateTime1.isBefore(dateTime2)) {
    System.out.println(dateTime1 + " は " + dateTime2 + " より前の日時です");
}

if (dateTime2.isAfter(dateTime1)) {
    System.out.println(dateTime2 + " は " + dateTime1 + " より後の日時です");
}


5. 日時のフォーマット

日時を特定のフォーマットで表示するには、DateTimeFormatterを使用します。

import java.time.format.DateTimeFormatter;

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");

String formattedDateTime = now.format(formatter);
System.out.println("フォーマットされた日時: " + formattedDateTime);


LocalDateTimeのメリットと注意点

メリット

  1. 直感的なAPI:日時の操作やフォーマットが簡単。
  2. 不変オブジェクト:スレッドセーフで安全。
  3. タイムゾーンを気にせず使える:タイムゾーンが必要ない場合に適している。

注意点

  1. タイムゾーン情報を持たない:タイムゾーンを考慮した日時操作が必要ならZonedDateTimeを使用。
  2. フォーマットの際に注意:カスタムフォーマットを指定しないとISO 8601形式(yyyy-MM-ddTHH:mm:ss)で表示される。

実用例

1. イベントの開始日時と終了日時を表示

LocalDateTime start = LocalDateTime.of(2025, 1, 1, 10, 0);
LocalDateTime end = start.plusHours(2); // 2時間後に終了

System.out.println("イベント開始: " + start);
System.out.println("イベント終了: " + end);


2. 未来の締切日を計算

LocalDateTime now = LocalDateTime.now();
LocalDateTime deadline = now.plusDays(10).withHour(17).withMinute(0);

System.out.println("締切日時: " + deadline);


3. 年末までの残り時間を計算

import java.time.temporal.ChronoUnit;

LocalDateTime now = LocalDateTime.now();
LocalDateTime endOfYear = LocalDateTime.of(now.getYear(), 12, 31, 23, 59, 59);

long daysLeft = ChronoUnit.DAYS.between(now, endOfYear);
long hoursLeft = ChronoUnit.HOURS.between(now, endOfYear);

System.out.println("年末まであと " + daysLeft + " 日 (" + hoursLeft + " 時間)");


練習問題

問題:指定した日時の1週間後を表示するプログラム

  1. ユーザーから日時(例: 2025-01-01T10:30)を入力。
  2. 入力された日時から1週間後の日時を計算して表示。

ヒント

  • LocalDateTime.parse()で文字列を日時に変換。
  • plusWeeks()で日時を加算。
import java.time.LocalDateTime;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("日時を入力してください (例: 2025-01-01T10:30): ");
        String input = scanner.nextLine();

        LocalDateTime dateTime = LocalDateTime.parse(input);
        LocalDateTime oneWeekLater = dateTime.plusWeeks(1);

        System.out.println("1週間後の日時: " + oneWeekLater);
    }
}


まとめと次のステップ

LocalDateTimeは、日付と時刻を簡単かつ安全に扱える便利なクラスです。特に、タイムゾーンを必要としないアプリケーションでの日時操作に最適です。

次に学ぶと良いテーマ:

  1. ZonedDateTime:タイムゾーンを含む日時操作。
  2. DurationとPeriod:時間や期間を扱うクラス。
  3. DateTimeFormatter:日時の高度なフォーマット操作。

ぜひ、実際のプログラムで試してみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。