Java LocalDateTime クラス

LocalDateTime は Java 8 で導入された日時 API(java.time パッケージ)における重要なクラスの一つで、タイムゾーン情報を含まない不変の日時オブジェクトを表します。このクラスは、年、月、日、時、分、秒、ナノ秒レベルの日時情報を格納できます。

LocalDateTime の特徴

  1. 不変性:すべての java.time クラスは不変であり、スレッドセーフです
  2. タイムゾーンを含まない:ローカルの日付と時刻のみを表します
  3. ナノ秒までの精度:ナノ秒レベルまで正確な時間を表せます
  4. 豊富な API:日時の計算やフォーマットのための多数のメソッドを提供します

LocalDateTime オブジェクトの作成

1. 静的ファクトリメソッドを使用

例

// 現在の日時を取得
LocalDateTime now = LocalDateTime.now();

// 指定した日時を作成
LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 14, 30, 45);

// 年、月、日、時、分を指定
LocalDateTime dateTime1 = LocalDateTime.of(2023, Month.MAY, 15, 14, 30);

// 年、月、日、時、分、秒を指定
LocalDateTime dateTime2 = LocalDateTime.of(2023, 5, 15, 14, 30, 45);

// 年、月、日、時、分、秒、ナノ秒を指定
LocalDateTime dateTime3 = LocalDateTime.of(2023, 5, 15, 14, 30, 45, 100);

2. LocalDate と LocalTime から組み合わせる

例

LocalDate date = LocalDate.of(2023, 5, 15);
LocalTime time = LocalTime.of(14, 30, 45);
LocalDateTime dateTime = LocalDateTime.of(date, time);

3. 文字列を解析する

例

LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T14:30:45");

よく使う操作メソッド

日時の各部分を取得する

例

LocalDateTime dateTime = LocalDateTime.now();

int year = dateTime.getYear();
Month month = dateTime.getMonth(); // Month 列挙型を返す
int monthValue = dateTime.getMonthValue(); // 1〜12 を返す
int day = dateTime.getDayOfMonth();
int hour = dateTime.getHour();
int minute = dateTime.getMinute();
int second = dateTime.getSecond();
int nano = dateTime.getNano();

日時の計算

例

LocalDateTime dateTime = LocalDateTime.now();

// 加算操作
LocalDateTime plusYears = dateTime.plusYears(1);
LocalDateTime plusMonths = dateTime.plusMonths(1);
LocalDateTime plusDays = dateTime.plusDays(1);
LocalDateTime plusHours = dateTime.plusHours(1);
LocalDateTime plusMinutes = dateTime.plusMinutes(1);
LocalDateTime plusSeconds = dateTime.plusSeconds(1);

// 減算操作
LocalDateTime minusYears = dateTime.minusYears(1);
LocalDateTime minusDays = dateTime.minusDays(1);
// 他の減算操作も同様...

日時の比較

例

LocalDateTime dateTime1 = LocalDateTime.of(2023, 5, 15, 14, 30);
LocalDateTime dateTime2 = LocalDateTime.of(2023, 5, 16, 14, 30);

boolean isBefore = dateTime1.isBefore(dateTime2); // true
boolean isAfter = dateTime1.isAfter(dateTime2); // false
boolean isEqual = dateTime1.isEqual(dateTime2); // false

日時の調整

例

LocalDateTime dateTime = LocalDateTime.now();

// 特定のフィールドを変更
LocalDateTime withYear = dateTime.withYear(2024);
LocalDateTime withHour = dateTime.withHour(15);
// 他のフィールドも同様...

// TemporalAdjusters を使用
LocalDateTime firstDayOfMonth = dateTime.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime lastDayOfYear = dateTime.with(TemporalAdjusters.lastDayOfYear());

フォーマットと解析

日時のフォーマット

例

LocalDateTime dateTime = LocalDateTime.now();

// 定義済みのフォーマットを使用
DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE_TIME;
String formatted = dateTime.format(isoDateTime);

// カスタムフォーマット
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String customFormatted = dateTime.format(formatter);

文字列を日時に解析する

例

String str = "2023-05-15 14:30:45";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parsedDateTime = LocalDateTime.parse(str, formatter);

他の日時クラスとの変換

LocalDate と LocalTime に変換する

例

LocalDateTime dateTime = LocalDateTime.now();

LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();

Instant と ZonedDateTime との変換

例

// タイムゾーン情報が必要
ZoneId zone = ZoneId.systemDefault();

// LocalDateTime を ZonedDateTime に変換
ZonedDateTime zonedDateTime = dateTime.atZone(zone);

// ZonedDateTime を LocalDateTime に変換
LocalDateTime fromZoned = zonedDateTime.toLocalDateTime();

// LocalDateTime を Instant に変換
Instant instant = zonedDateTime.toInstant();

// Instant を LocalDateTime に変換
LocalDateTime fromInstant = LocalDateTime.ofInstant(instant, zone);

実践的な応用例

2つの日時の間隔を計算する

例

LocalDateTime start = LocalDateTime.of(2023, 5, 15, 9, 0);
LocalDateTime end = LocalDateTime.of(2023, 5, 16, 17, 30);

Duration duration = Duration.between(start, end);

long hours = duration.toHours(); // 32
long minutes = duration.toMinutes(); // 1950

日付が特定の範囲内かどうかを確認する

例

LocalDateTime checkDate = LocalDateTime.of(2023, 5, 15, 14, 0);
LocalDateTime startDate = LocalDateTime.of(2023, 5, 1, 0, 0);
LocalDateTime endDate = LocalDateTime.of(2023, 5, 31, 23, 59);

boolean isInRange = !checkDate.isBefore(startDate) && !checkDate.isAfter(endDate);

日時のシーケンスを生成する

例

LocalDateTime start = LocalDateTime.of(2023, 5, 1, 9, 0);
List<LocalDateTime> dateTimes = new ArrayList<>();

for (int i = 0; i < 10; i++) {
    dateTimes.add(start.plusDays(i));
}

総合的な例

例

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

public class LocalDateTimeDemo {
    public static void main(String[] args) {
        // 1. 現在の日時を取得
        LocalDateTime now = LocalDateTime.now();
        System.out.println(現在の日時: + now);
       
        // 2. 特定の日時を作成
        LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 10, 30, 45);
        System.out.println("特定の日時: " + specificDateTime);
       
        // 3. 文字列から解析
        LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T10:30:45");
        System.out.println("解析した日時: " + parsedDateTime);
       
        // 4. フォーマットして出力
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        String formattedDateTime = now.format(formatter);
        System.out.println("フォーマット後の日時: " + formattedDateTime);
       
        // 5. 各部分を取得
        System.out.println("年: " + now.getYear());
        System.out.println("月: " + now.getMonthValue() + " (" + now.getMonth() + ")");
        System.out.println("日: " + now.getDayOfMonth());
        System.out.println("時: " + now.getHour());
        System.out.println("分: " + now.getMinute());
        System.out.println("秒: " + now.getSecond());
       
        // 6. 日時の演算
        LocalDateTime tomorrow = now.plusDays(1);
        System.out.println("明日の今頃: " + tomorrow);
       
        LocalDateTime lastWeek = now.minusWeeks(1);
        System.out.println("先週の今頃: " + lastWeek);
       
        // 7. 日時の比較
        System.out.println("現在が特定の時間より後か: " + now.isAfter(specificDateTime));
        System.out.println("現在が特定の時間より前か: " + now.isBefore(specificDateTime));
    }
}

出力結果は次のとおりです。

格式化后的日期时间: 2025年05月01日 11:25:48
年: 2025
月: 5 (MAY)
日: 1
时: 11
分: 25
秒: 48
明天此时: 2025-05-02T11:25:48.651400
上周此时: 2025-04-24T11:25:48.651400
现在是否在特定时间之后: true
现在是否在特定时间之前: false

日時の変換

例

import java.time.*;

public class DateTimeConversion {
    public static void main(String[] args) {
        // LocalDateTime を LocalDate と LocalTime に変換
        LocalDateTime dateTime = LocalDateTime.now();
        LocalDate date = dateTime.toLocalDate();
        LocalTime time = dateTime.toLocalTime();
       
        System.out.println("日付部分: " + date);
        System.out.println("時刻部分: " + time);
       
        // LocalDate と LocalTime から LocalDateTime を作成
        LocalDateTime combined = LocalDateTime.of(date, time);
        System.out.println("組み合わせた日時: " + combined);
       
        // Instant との変換(タイムゾーンが必要)
        ZoneId zone = ZoneId.of("Asia/Shanghai");
        Instant instant = dateTime.atZone(zone).toInstant();
        System.out.println("Instant に変換: " + instant);
    }
}

出力結果は次のとおりです。

日期部分: 2025-05-01
时间部分: 11:27:02.724101
组合后的日期时间: 2025-05-01T11:27:02.724101
转换为Instant: 2025-05-01T03:27:02.724101Z

まとめ

LocalDateTime クラスは、Java 8 の日時 API で非常に実用的なクラスであり、タイムゾーンを含まない日付と時刻を扱うための豊富なメソッドを提供します。この記事の学習を通じて、次のことを理解できたはずです。

  1. LocalDateTime オブジェクトの作成方法
  2. 日時の計算と比較の方法
  3. 日時のフォーマットと解析の方法
  4. 他の日時クラスとの変換方法
  5. いくつかの実践的な応用シナリオ

LocalDateTime は、誕生日や会議時間など、タイムゾーン情報を必要としない業務シナリオの処理に非常に適しています。タイムゾーンの処理が必要なシナリオでは、ZonedDateTime クラスの使用を検討すべきです。

静的ファクトリメソッド

メソッド 説明 例
static LocalDateTime now() 現在の日時を取得 LocalDateTime.now()
static LocalDateTime of(int year, int month, int day, int hour, int minute) 年月日時分を指定して作成 LocalDateTime.of(2023, 6, 15, 14, 30)
static LocalDateTime of(int year, int month, int day, int hour, int minute, int second) 年月日時分秒を指定して作成 LocalDateTime.of(2023, 6, 15, 14, 30, 45)
static LocalDateTime of(int year, Month month, int day, int hour, int minute) Month 列挙型を使用して作成 LocalDateTime.of(2023, Month.JUNE, 15, 14, 30)
static LocalDateTime of(LocalDate date, LocalTime time) LocalDate と LocalTime を組み合わせて作成 LocalDateTime.of(LocalDate.now(), LocalTime.now())
static LocalDateTime parse(CharSequence text) 文字列から解析(ISO形式) LocalDateTime.parse("2023-06-15T14:30:45")
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) 指定したフォーマットで解析 LocalDateTime.parse("15/06/2023 14:30", DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))

日時情報の取得

メソッド 説明 例
int getYear() 年を取得 2023
Month getMonth() 月を取得(Month 列挙型) Month.JUNE
int getMonthValue() 月の値を取得(1〜12) 6
int getDayOfMonth() 月の日の数を取得 15
int getDayOfYear() 年の日の数を取得 166
DayOfWeek getDayOfWeek() 曜日を取得(DayOfWeek 列挙型) DayOfWeek.THURSDAY
int getHour() 時を取得(0〜23) 14
int getMinute() 分を取得(0-59) 30
int getSecond() 秒を取得(0-59) 45
int getNano() ナノ秒を取得 0

日時操作

メソッド 説明 例
LocalDateTime plusDays(long days) 日数を加算 dt.plusDays(5)
LocalDateTime plusHours(long hours) 時間を加算 dt.plusHours(2)
LocalDateTime plusMinutes(long minutes) 分を加算 dt.plusMinutes(30)
LocalDateTime plusSeconds(long seconds) 秒を加算 dt.plusSeconds(45)
LocalDateTime plusNanos(long nanos) ナノ秒を加算 dt.plusNanos(1000000)
LocalDateTime minusDays(long days) 日数を減算 dt.minusDays(5)
LocalDateTime minusHours(long hours) 時間を減算 dt.minusHours(2)
LocalDateTime minusMinutes(long minutes) 分を減算 dt.minusMinutes(30)
LocalDateTime minusSeconds(long seconds) 秒を減算 dt.minusSeconds(45)
LocalDateTime minusNanos(long nanos) ナノ秒を減算 dt.minusNanos(1000000)
LocalDateTime withYear(int year) 年を変更 dt.withYear(2024)
LocalDateTime withMonth(int month) 月を変更 dt.withMonth(12)
LocalDateTime withDayOfMonth(int day) 月の日数を変更 dt.withDayOfMonth(1)
LocalDateTime withHour(int hour) 時を変更 dt.withHour(0)
LocalDateTime withMinute(int minute) 分を変更 dt.withMinute(0)
LocalDateTime withSecond(int second) 秒を変更 dt.withSecond(0)
LocalDateTime withNano(int nano) ナノ秒を変更 dt.withNano(0)

日時の比較

メソッド 説明 例
boolean isAfter(ChronoLocalDateTime<?> other) 指定された日時より後かどうか dt1.isAfter(dt2)
boolean isBefore(ChronoLocalDateTime<?> other) 指定された日時より前かどうか dt1.isBefore(dt2)
boolean isEqual(ChronoLocalDateTime<?> other) 指定された日時と等しいかどうか dt1.isEqual(dt2)
int compareTo(ChronoLocalDateTime<?> other) 2つの日時を比較 dt1.compareTo(dt2)

変換メソッド

メソッド 説明 例
LocalDate toLocalDate() LocalDateに変換 dt.toLocalDate()
LocalTime toLocalTime() LocalTimeに変換 dt.toLocalTime()
Instant toInstant(ZoneOffset offset) Instantに変換 dt.toInstant(ZoneOffset.UTC)
ZonedDateTime atZone(ZoneId zone) ZonedDateTimeに変換 dt.atZone(ZoneId.of("Asia/Shanghai"))
OffsetDateTime atOffset(ZoneOffset offset) OffsetDateTimeに変換 dt.atOffset(ZoneOffset.ofHours(8))

フォーマットと文字列変換

メソッド 説明 例
String format(DateTimeFormatter formatter) 文字列にフォーマット dt.format(DateTimeFormatter.ISO_DATE_TIME)
String toString() ISO形式の文字列に変換 "2023-06-15T14:30:45"
その他の拡張