Javaの期間と期間

Javaの期間と期間

1. 概要

このクイックチュートリアルでは、Java 8で導入された日付を操作するための2つの新しいクラスPeriodDurationを見ていきます。

両方のクラスを使用して、時間を表すか、2つの日付の差を判断できます。 2つのクラスの主な違いは、Periodは日付ベースの値を使用するのに対し、Durationは時間ベースの値を使用することです。

2. Periodクラス

Periodクラスは、年、月、日の単位を使用して期間を表します。

between()メソッドを使用すると、2つの日付の差としてPeriodオブジェクトを取得できます。

LocalDate startDate = LocalDate.of(2015, 2, 20);
LocalDate endDate = LocalDate.of(2017, 1, 15);

Period period = Period.between(startDate, endDate);

次に、メソッドgetYears(), getMonths(), getDays()を使用して、期間の日付単位を決定できます。

LOG.info("Years:" + period.getYears() +
  " months:" + period.getMonths() +
  " days:"+period.getDays());

この場合、いずれかの単位が負の場合にtrueを返すisNegative()メソッドを使用して、endDatestartDateよりも高いかどうかを判断できます。

assertFalse(period.isNegative());

isNegative()がfalseを返す場合、startDateendDate値よりも前です。

専用のメソッドを使用してcreate a Period object is based on the number of days, months, weeks or yearsを実行する別の方法:

Period fromUnits = Period.of(3, 10, 10);
Period fromDays = Period.ofDays(50);
Period fromMonths = Period.ofMonths(5);
Period fromYears = Period.ofYears(10);
Period fromWeeks = Period.ofWeeks(40);

assertEquals(280, fromWeeks.getDays());

たとえばofDays()メソッドを使用して、値の1つだけが存在する場合、他の単位の値は0です。

ofWeeks()メソッドの場合、パラメーター値を使用して、7を掛けて日数を設定します。

create a Period object by parsing a text sequenceも可能です。これは、「PnYnMnD」の形式である必要があります。

Period fromCharYears = Period.parse("P2Y");
assertEquals(2, fromCharYears.getYears());

Period fromCharUnits = Period.parse("P2Y3M5D");
assertEquals(5, fromCharUnits.getDays());

期間の値は、plusX()およびminusX()の形式のメソッドを使用して増減できます。ここで、Xは日付の単位を表します。

assertEquals(56, period.plusDays(50).getDays());
assertEquals(9, period.minusMonths(2).getMonths());

3. Durationクラス

Durationクラスは、秒またはナノ秒単位の時間間隔を表し、より高い精度が必要な場合に、より短い時間を処理するのに最も適しています。

between()メソッドを使用して、2つの瞬間の違いをDurationオブジェクトとして判別できます。

Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
Instant end = Instant.parse("2017-10-03T10:16:30.00Z");

Duration duration = Duration.between(start, end);

次に、getSeconds()またはgetNanoseconds()メソッドを使用して、時間単位の値を決定できます。

assertEquals(60, duration.getSeconds());

または、2つのLocalDateTimeインスタンスからDurationインスタンスを取得できます。

LocalTime start = LocalTime.of(1, 20, 25, 1024);
LocalTime end = LocalTime.of(3, 22, 27, 1544);

Duration.between(start, end).getSeconds();

isNegative()メソッドを使用して、終了瞬間が開始瞬間よりも高いかどうかを確認できます。

assertFalse(duration.isNegative());

メソッドofDays(), ofHours(), ofMillis(), ofMinutes(), ofNanos(), ofSeconds()を使用して、obtain a Duration object based on several time unitsを実行することもできます。

Duration fromDays = Duration.ofDays(1);
assertEquals(86400, fromDays.getSeconds());

Duration fromMinutes = Duration.ofMinutes(60);

テキストシーケンスに基づいてDurationオブジェクトを作成するには、これは「PnDTnHnMn.nS」の形式である必要があります。

Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
Duration fromChar2 = Duration.parse("PT10M");

toDays(), toHours(), toMillis(), toMinutes()を使用したA duration can be converted to other time units

assertEquals(1, fromMinutes.toHours());

期間の値は、plusX()またはminusX()の形式のメソッドを使用して増減できます。ここで、Xは、日、時間、ミリ、分、ナノ、または秒を表します。

assertEquals(120, duration.plusSeconds(60).getSeconds());
assertEquals(30, duration.minusSeconds(30).getSeconds());

plus()メソッドとminus()メソッドを、加算または減算するTemporalUnitを指定するパラメーターとともに使用することもできます。

assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds());
assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());

4. 結論

このチュートリアルでは、PeriodクラスとDurationクラスを使用する方法を示しました。

いつものように、例の完全なソースコードはover on GitHubにあります。