Javaでの期間と期間
1. 概要
このクイックチュートリアルでは、Java8で導入された日付を操作するための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 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のにあります。