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 パターンを示します。
ChronoUnit.betweenで単位を明示Period.betweenで年月日をまとめて取得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(plusHours、truncatedTo など)で時刻計算が可能です。