1. 概要

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

どちらのクラスも、時間を表すため、または2つの日付の差を判別するために使用できます。 2つのクラスの主な違いは、 Period が日付ベースの値を使用するのに対し、durationは時間ベースの値を使用することです。

2. 期間クラス

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());

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

assertFalse(period.isNegative());

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

期間オブジェクトを作成する別の方法は、専用のメソッドを使用して、日数、月数、週数、または年数に基づいています。

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を掛けて設定します。

「PnYnMnD」の形式である必要があるテキストシーケンスを解析することにより、Periodオブジェクトを作成することもできます。

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 クラスは、秒またはナノ秒単位の時間間隔を表し、より高い精度が必要な場合に、より短い時間を処理するのに最適です。

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

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()を使用して、複数の時間単位に基づいてDurationオブジェクトを取得することもできます。 ]:

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()を使用して他の時間単位に変換できます。

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クラスの使用方法を示しました。

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