Java 8 日付・時刻 API:LocalDate と LocalDateTime の実践ガイド

Java 8 以降、java.time パッケージにより日付・時刻の扱いが一新されました。ここでは LocalDate を中心に、生成・計算・分解能まで網羅的に解説します。

LocalDate の基本生成パターン

ファクトリ概要
LocalDate.now()システムデフォルトゾーンの今日
LocalDate.now(ZoneId.of("Asia/Tokyo"))指定ゾーンの今日
LocalDate.of(2024, 6, 15)年月日から直接生成
LocalDate.ofYearDay(2024, 180)年番号+通日
LocalDate.ofEpochDay(19000)1970-01-01 からの通算日
LocalDate.parse("20240615", DateTimeFormatter.BASIC_ISO_DATE)独自フォーマットからパース

コード例:さまざまな生成方法

import java.time.*;
import java.time.format.*;

public class LocalDateFactory {
    public static void main(String[] args) {
        System.out.println(LocalDate.now());                       // 2024-06-15
        System.out.println(LocalDate.now(Clock.systemUTC()));      // 2024-06-15
        System.out.println(LocalDate.now(ZoneId.of("Asia/Tokyo")));// 2024-06-15
        System.out.println(LocalDate.of(2024, Month.JUNE, 15));    // 2024-06-15
        System.out.println(LocalDate.ofYearDay(2024, 167));        // 2024-06-15
        System.out.println(LocalDate.ofEpochDay(19700));           // 2024-01-30
        System.out.println(LocalDate.parse("2024-06-15"));
        System.out.println(LocalDate.parse("20240615", DateTimeFormatter.BASIC_ISO_DATE));
    }
}

日付の加算・減算

メソッド用途
plusDays(n)n 日後
plusWeeks(n)n 週間後
plusMonths(n)n ヶ月後
plusYears(n)n 年後
minus(long, TemporalUnit)汎用減算
plus(Period)期間オブジェクトで加算
import java.time.*;
import java.time.temporal.ChronoUnit;

public class DateArithmetic {
    public static void main(String[] args) {
        LocalDate base = LocalDate.of(2024, 6, 15);

        System.out.println(base.plus(3, ChronoUnit.WEEKS));        // 2024-07-06
        System.out.println(base.minus(Period.of(1, 2, 5)));         // 2023-04-10
        System.out.println(base.plusDays(-7));                       // 2024-06-08
    }
}

フィールド分解とユーティリティ

メソッド戻り値
getYear()西暦年
getMonthValue()1〜12
getDayOfMonth()月内日番号
getDayOfWeek()DayOfWeek 列挙
getDayOfYear()通日 1〜365/366
lengthOfYear()年間日数
toEpochDay()1970-01-01 からの通算日
import java.time.*;
import java.time.temporal.ChronoField;

public class DateDecomposer {
    public static void main(String[] args) {
        LocalDate today = LocalDate.of(2024, 6, 15);

        System.out.println("Year : " + today.getYear());                // 2024
        System.out.println("Month: " + today.getMonthValue());          // 6
        System.out.println("Day  : " + today.getDayOfMonth());            // 15
        System.out.println("DOW  : " + today.getDayOfWeek());             // SATURDAY
        System.out.println("DOY  : " + today.getDayOfYear());             // 167
        System.out.println("Epoch: " + today.toEpochDay());              // 19857
        System.out.println("YearLen: " + today.lengthOfYear());           // 366
    }
}

期間の算出

2 つの LocalDate 間の差を求める代表的な 3 パターンを示します。

  1. ChronoUnit.between で単位を明示
  2. Period.between で年月日をまとめて取得
  3. toEpochDay で単純日数差
import java.time.*;
import java.time.temporal.ChronoUnit;

public class DateInterval {
    public static void main(String[] args) {
        LocalDate start = LocalDate.of(2022, 5, 20);
        LocalDate end   = LocalDate.of(2024, 6, 15);

        long days  = ChronoUnit.DAYS.between(start, end);      // 756
        long months = ChronoUnit.MONTHS.between(start, end);   // 25
        long years = ChronoUnit.YEARS.between(start, end);     // 2

        Period p = Period.between(start, end);
        System.out.printf("%d 年 %d 月 %d 日%n",
                p.getYears(), p.getMonths(), p.getDays());     // 2 年 0 月 26 日

        System.out.println("単純日数差: " +
                (end.toEpochDay() - start.toEpochDay()));      // 756
    }
}

LocalDateTime への拡張

LocalDate に時分秒を付与すると LocalDateTime が得られます。

LocalDateTime ldt = LocalDate.now()
                             .atTime(13, 45);        // 2024-06-15T13:45

以降は LocalDateTime 独自の API(plusHourstruncatedTo など)で時刻計算が可能です。

タグ: Java8 LocalDate localdatetime DateTimeFormatter ChronoUnit

7月10日 22:47 投稿