JavaのDurationとPeriodの使い方を完全ガイド!日付の差を正確に求める方法
生徒
「Javaで2つの日付の差を調べたいんですけど、どうすればいいですか?」
先生
「JavaにはDurationとPeriodという2つのクラスがあって、それを使えば簡単に日付や時間の差分が求められますよ。」
生徒
「その2つって何が違うんですか?」
先生
「それじゃあ、DurationとPeriodの違いと使い方を詳しく解説していきましょう!」
1. Javaで日付の差を求めるには?
Javaで2つの日付の差を求めるには、java.timeパッケージに含まれるDurationクラスとPeriodクラスを使います。Javaの例外処理では時間操作もよく使うため、これらのクラスの理解は非常に重要です。
Durationは「時間の差分」をミリ秒や秒、分、時間単位で扱うのに対して、Periodは「日付の差分」を年・月・日単位で扱います。
2. Durationクラスの使い方(時間の差を求める)
Durationクラスは、LocalTimeやLocalDateTimeなどの時間を扱うクラスと一緒に使います。ミリ秒・秒・分・時間の差を扱いたいときに便利です。
たとえば、2つの日時の差を秒単位で取得するには以下のように書きます。
import java.time.Duration;
import java.time.LocalDateTime;
public class DurationExample {
public static void main(String[] args) {
LocalDateTime start = LocalDateTime.of(2023, 1, 1, 12, 0);
LocalDateTime end = LocalDateTime.of(2023, 1, 1, 14, 30);
Duration duration = Duration.between(start, end);
System.out.println("時間差:" + duration.toHours() + " 時間");
System.out.println("分差:" + duration.toMinutes() + " 分");
System.out.println("秒差:" + duration.getSeconds() + " 秒");
}
}
時間差:2 時間
分差:150 分
秒差:9000 秒
このようにDurationを使えば、時間単位での差分を柔軟に取得できます。
3. Periodクラスの使い方(日付の差を求める)
Periodクラスは、LocalDateクラスと一緒に使い、2つの日付の差を「年・月・日」の単位で計算します。日付の計算やスケジュール管理などでよく使われます。
次のコードでは、2つの日付の差分を取得しています。
import java.time.LocalDate;
import java.time.Period;
public class PeriodExample {
public static void main(String[] args) {
LocalDate startDate = LocalDate.of(2020, 5, 10);
LocalDate endDate = LocalDate.of(2023, 9, 1);
Period period = Period.between(startDate, endDate);
System.out.println("年差:" + period.getYears() + " 年");
System.out.println("月差:" + period.getMonths() + " ヶ月");
System.out.println("日差:" + period.getDays() + " 日");
}
}
年差:3 年
月差:3 ヶ月
日差:22 日
Periodは「年・月・日」の差を求めたいときに最適です。
4. DurationとPeriodの違いを整理しよう
初心者が混乱しやすいポイントがDurationとPeriodの違いです。以下にまとめます。
- Duration:
LocalDateTimeやInstantなどの日時型に使う。ミリ秒・秒・分・時間単位。 - Period:
LocalDateなどの日付型に使う。年・月・日単位。
どちらもJavaの時間操作に欠かせないクラスです。用途に応じて正しく使い分けましょう。
5. DurationやPeriodと例外処理を組み合わせるには?
Javaで例外処理と組み合わせて日付の差を安全に取得することも可能です。たとえば、ユーザーが入力した日時が無効だった場合にはDateTimeParseExceptionなどをキャッチしてエラーハンドリングを行います。
import java.time.*;
import java.time.format.DateTimeParseException;
public class DateDiffWithException {
public static void main(String[] args) {
try {
LocalDateTime start = LocalDateTime.parse("2023-01-01T10:00:00");
LocalDateTime end = LocalDateTime.parse("2023-01-01T12:45:00");
Duration d = Duration.between(start, end);
System.out.println("差:" + d.toMinutes() + " 分");
} catch (DateTimeParseException e) {
System.out.println("日付の形式が正しくありません: " + e.getMessage());
}
}
}
差:165 分
このように、例外処理を活用することで、ユーザー入力やAPIの戻り値にも柔軟に対応できます。
6. Javaの日付操作に便利なその他のクラス
日付の差を求める以外にも、Javaには便利な日付操作クラスがいくつか存在します。
ChronoUnit:日付や時間の差を任意の単位で取得TemporalAdjusters:次の月初や月末などに日付を調整DateTimeFormatter:日付のフォーマット変換
Javaでの時間処理は業務システムでもよく使う機能なので、これらのクラスも一緒に覚えておくと便利です。