DurationクラスとPeriodクラスを新人エンジニアに解説
こんにちは。ゆうせいです。
今回は、JavaのDurationクラスとPeriodクラスについて解説します!
これらは、時間や期間の計算を扱うためのクラスで、Java 8で導入された新しい日時APIの一部です。
DurationとPeriodの違い
1. Durationクラス
- 時間の差(秒やナノ秒)を表します。
- 時刻(
LocalTime
、LocalDateTime
)の間隔を計算するのに適しています。 - 例: 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時間
練習問題
問題:誕生日までの期間と時間を計算
- 今日の日付と現在時刻を取得。
- ユーザーに次の誕生日を入力してもらう(例:
2025-01-01T00:00
)。 - 誕生日までの日数(Period)と時間(Duration)を計算して表示。
まとめと次のステップ
- Duration:秒やナノ秒単位の時間差を扱う。
- Period:日付ベースで年、月、日を扱う。
これらを使うと、時間や日付に関連するプログラムが簡単に書けるようになります!
次に学ぶと良いテーマ:
- ChronoUnit:日付や時間の差を簡単に計算。
- ZonedDateTime:タイムゾーンを含む日時操作。
- Stream APIと連携:リストの日時を一括操作。
ぜひ実際のコードで試してみてください!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
- 新入社員2025年1月8日新人エンジニアの皆さんに向けて「共有フォルダのマナー」を解説
- 新人エンジニア研修講師2025年1月7日研修講師が道徳的免罪符(moral licensing)に陥らないためにできること
- 新入社員2025年1月7日Windowsユーザーの日常生活や仕事で役立つPythonプログラム30選
- 新入社員2025年1月7日Pythonの入門研修の最後に行う演習の例