1概要

このクイックチュートリアルでは、Java 8で導入された日付を扱うための2つの新しいクラス、

Period



Duration

を見ていきます。

どちらのクラスも、時間を表すため、または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を返す場合、

startDate



endDate

値より前です。


Period

オブジェクトを作成するもう1つの方法は、専用のメソッドを使用した日数、月数、週数、または年数に基づくものです。

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倍して設定します。

  • テキストシーケンス** を解析することによって

    Period

    オブジェクトを作成することもできます。これはフォーマット“ 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

クラスは、秒単位またはナノ秒単位の時間間隔を表します。精度を必要とする場合は、短い時間を処理するのに最適です。


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

を使用して

複数の時間単位

に基づいて

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

加算または減算する

TemporalUnit

を指定するパラメーターを使用して、

plus()

および

minus()

メソッドを使用することもできます。

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

4.まとめ

このチュートリアルでは、

Period

クラスと

Duration

クラスの使い方を説明しました。

いつものように、例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/java-dates[over on GitHub]にあります。