DurationクラスとPeriodクラスを新人エンジニアに解説

こんにちは。ゆうせいです。
今回は、JavaのDurationクラスPeriodクラスについて解説します!
これらは、時間や期間の計算を扱うためのクラスで、Java 8で導入された新しい日時APIの一部です。


DurationとPeriodの違い

1. Durationクラス

  • 時間の差(秒やナノ秒)を表します。
  • 時刻(LocalTimeLocalDateTime)の間隔を計算するのに適しています。
  • 例: 3時間45分、120秒。

2. Periodクラス

  • 日付の差(年、月、日)を表します。
  • 日付(LocalDate)の間隔を計算するのに適しています。
  • 例: 2年3か月15日。

例えるなら…

  • Durationは「ストップウォッチの計測時間」のようなもの。
  • Periodは「カレンダーの上での期間」のようなもの。

Durationクラスの使い方

1. Durationの生成

固定値を指定して生成

Duration.ofXxx()で、時間の単位を指定して生成します。

import java.time.Duration;

Duration threeHours = Duration.ofHours(3);  // 3時間
Duration twoMinutes = Duration.ofMinutes(2); // 2分
Duration tenSeconds = Duration.ofSeconds(10); // 10秒

System.out.println(threeHours); // PT3H
System.out.println(twoMinutes); // PT2M
System.out.println(tenSeconds); // PT10S

2つの時刻から生成

Duration.between()を使って、2つの時刻の差を計算します。

import java.time.LocalTime;
import java.time.Duration;

LocalTime start = LocalTime.of(10, 0);
LocalTime end = LocalTime.of(13, 30);

Duration duration = Duration.between(start, end);
System.out.println("時間差: " + duration); // PT3H30M


2. Durationの値を取得

Durationから具体的な値を取得するには、以下のメソッドを使います。

Duration duration = Duration.ofHours(3).plusMinutes(15);

long hours = duration.toHours();      // 時間に変換
long minutes = duration.toMinutes();  // 分に変換
long seconds = duration.getSeconds(); // 秒に変換

System.out.println("時間: " + hours);      // 3
System.out.println("分: " + minutes);     // 195
System.out.println("秒: " + seconds);     // 11700


3. Durationの計算

Durationに時間を加算・減算できます。

Duration duration = Duration.ofHours(2);

Duration plusDuration = duration.plusMinutes(30);  // 30分追加
Duration minusDuration = duration.minusMinutes(15); // 15分減少

System.out.println("加算後: " + plusDuration); // PT2H30M
System.out.println("減算後: " + minusDuration); // PT1H45M


Periodクラスの使い方

1. Periodの生成

固定値を指定して生成

Period.ofXxx()で、期間を指定します。

import java.time.Period;

Period oneYear = Period.ofYears(1);      // 1年
Period twoMonths = Period.ofMonths(2);  // 2か月
Period tenDays = Period.ofDays(10);     // 10日

System.out.println(oneYear);   // P1Y
System.out.println(twoMonths); // P2M
System.out.println(tenDays);   // P10D

2つの日付から生成

Period.between()を使って、2つの日付の差を計算します。

import java.time.LocalDate;
import java.time.Period;

LocalDate startDate = LocalDate.of(2025, 1, 1);
LocalDate endDate = LocalDate.of(2027, 3, 15);

Period period = Period.between(startDate, endDate);
System.out.println("期間: " + period); // P2Y2M14D


2. Periodの値を取得

Periodから具体的な値を取得するには、以下のメソッドを使います。

Period period = Period.of(2, 3, 15);

int years = period.getYears();  // 年
int months = period.getMonths(); // 月
int days = period.getDays();    // 日

System.out.println("年: " + years);  // 2
System.out.println("月: " + months); // 3
System.out.println("日: " + days);  // 15


3. Periodの計算

Periodに期間を加算・減算できます。

Period period = Period.of(1, 2, 15);

Period plusPeriod = period.plusMonths(3);  // 3か月追加
Period minusPeriod = period.minusDays(10); // 10日減少

System.out.println("加算後: " + plusPeriod);  // P1Y5M15D
System.out.println("減算後: " + minusPeriod); // P1Y2M5D


DurationとPeriodの違いを実用例で理解する

1. Durationの例:作業時間の計算

import java.time.LocalTime;
import java.time.Duration;

LocalTime startWork = LocalTime.of(9, 0);
LocalTime endWork = LocalTime.of(17, 30);

Duration workDuration = Duration.between(startWork, endWork);
System.out.println("作業時間: " + workDuration.toHours() + "時間" + (workDuration.toMinutesPart()) + "分");
// 作業時間: 8時間30分


2. Periodの例:プロジェクトの期間計算

import java.time.LocalDate;
import java.time.Period;

LocalDate startProject = LocalDate.of(2023, 1, 1);
LocalDate endProject = LocalDate.of(2025, 12, 31);

Period projectDuration = Period.between(startProject, endProject);
System.out.println("プロジェクト期間: " + projectDuration.getYears() + "年" + projectDuration.getMonths() + "か月" + projectDuration.getDays() + "日");
// プロジェクト期間: 2年11か月30日


3. DurationとPeriodの違いを組み合わせた例

例えば、イベント開催までの「日数」と「時間」を計算する。

import java.time.LocalDateTime;
import java.time.Duration;
import java.time.Period;

LocalDateTime now = LocalDateTime.now();
LocalDateTime eventDateTime = LocalDateTime.of(2025, 1, 1, 15, 0);

Period period = Period.between(now.toLocalDate(), eventDateTime.toLocalDate());
Duration duration = Duration.between(now, eventDateTime);

System.out.println("イベントまでの日数: " + period.getYears() + "年" + period.getMonths() + "か月" + period.getDays() + "日");
System.out.println("イベントまでの時間: " + duration.toHours() + "時間");
// 例: イベントまでの日数: 1年2か月3日
//     イベントまでの時間: 955時間


練習問題

問題:誕生日までの期間と時間を計算

  1. 今日の日付と現在時刻を取得。
  2. ユーザーに次の誕生日を入力してもらう(例: 2025-01-01T00:00)。
  3. 誕生日までの日数(Period)と時間(Duration)を計算して表示。

まとめと次のステップ

  • Duration:秒やナノ秒単位の時間差を扱う。
  • Period:日付ベースで年、月、日を扱う。

これらを使うと、時間や日付に関連するプログラムが簡単に書けるようになります!
次に学ぶと良いテーマ:

  1. ChronoUnit:日付や時間の差を簡単に計算。
  2. ZonedDateTime:タイムゾーンを含む日時操作。
  3. Stream APIと連携:リストの日時を一括操作。

ぜひ実際のコードで試してみてください!

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

投稿者プロフィール

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