1概要

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

TemporalAdjuster

について簡単に説明し、それをいくつかの実用的なシナリオで使用します。

Java 8は日付と時刻を扱うための新しいライブラリを導入しました –

java.time



TemporalAdjuster

はその一部です。

java.timeについてもっと知りたい場合は、

check

この紹介記事

を参照してください。

簡単に言うと、

TemporalAdjuster

は、

Temporal

オブジェクトを調整するための戦略です。

TemporalAdjuster

の使用法に入る前に、

Temporal

インターフェース自体を見てみましょう。


2

テンポラル



Temporal

は、使用する実装に応じて、日付、時刻、または両方の組み合わせの表現を定義します。

以下を含む

Temporal

インターフェースの実装がいくつかあります。


  • LocalDate

    – タイムゾーンなしの日付を表します


  • LocalDateTime

    – タイムゾーンなしの日付と時刻を表します。


  • HijrahDate

    – Hijrahカレンダーシステムの日付を表します


  • MinguoDate

    – Minguoカレンダーシステムの日付を表します


  • ThaiBuddhistDate

    – タイ仏教徒の日付を表します

カレンダーシステム


3

TemporalAdjuster


この新しいライブラリに含まれているインタフェースの1つは

TemporalAdjuster

です。


TemporalAdjuster

は、

TemporalAdjusters

クラスに多数の定義済み実装がある機能インタフェースです。このインタフェースには

adjustInto()

という名前の単一の抽象メソッドがあり、その実装では、

Temporal

オブジェクトを渡すことで呼び出すことができます。


TemporalAdjuster

を使用すると、複雑な日付操作を実行できます。

例えば

、私たちは次の日曜日の日付、今月の最後の日、または来年の最初の日を得ることができます。もちろん、古い

java.util.Calendar

を使用してこれを実行できます。

ただし、新しいAPIは、事前定義された実装を使用して基礎となるロジックを抽象化しています。詳細については、https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjuster.html[Javadoc]を参照してください。


4定義済み

TemporalAdjusters



TemporalAdjusters

クラスには、

Temporal

の実装に関係なく、

Temporal

オブジェクトをさまざまな方法で調整するための

TemporalAdjuster

オブジェクトを返す、定義済みの静的メソッドが多数あります。

これらのメソッドの簡単なリストと簡単な定義は次のとおりです。


  • dayOfWeekInMonth()

    – 通常の曜日のためのアジャスタ。にとって

例:3月の第2火曜日の日付
**

firstDayOfMonth()

– 最初の日の日付の調整文字

今月
**

firstDayOfNextMonth()

– 最初の日の日付の調整文字

翌月
**

firstDayOfNextYear()

– 最初の日の日付の調整文字

来年
**

firstDayOfYear()

– 最初の日の日付の調整文字

今年
**

lastDayOfMonth()

– 最後の日の日付の調整文字

今月
**

nextOrSame()

– 次に出現する日付の調整文字

特定の曜日、または今日が必要な曜日と一致する場合は同じ日

ご覧のとおり、メソッドの名前は一目瞭然です。

TemporalAdjusters

については、https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjusters.html[Javadoc]を参照してください。

  • 簡単な例から始めましょう** – 例のように特定の日付を使う代わりに、

    LocalDate.now()

    を使ってシステムクロックから現在の日付を取得できます。

ただし、このチュートリアルでは、予想される結果が変化したときにテストが失敗しないように、固定日を使用します。 2017-07-08以降の日曜日の日付を取得するために

TemporalAdjusters

クラスを使用する方法を見てみましょう。

@Test
public void whenAdjust__thenNextSunday() {
    LocalDate localDate = LocalDate.of(2017, 07, 8);
    LocalDate nextSunday = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));

    String expected = "2017-07-09";

    assertEquals(expected, nextSunday.toString());
}

今月の最終日を取得する方法は次のとおりです。

LocalDate lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());


5カスタム

TemporalAdjuster

実装の定義


TemporalAdjuster

のカスタム実装も定義できます。

これを行うには2つの異なる方法があります。


5.1. ラムダ式の使用


Temporal.with()

メソッドを使用して、2017-07-08の14日後の日付を取得する方法を見てみましょう。

@Test
public void whenAdjust__thenFourteenDaysAfterDate() {
    LocalDate localDate = LocalDate.of(2017, 07, 8);
    TemporalAdjuster temporalAdjuster = t -> t.plus(Period.ofDays(14));
    LocalDate result = localDate.with(temporalAdjuster);

    String fourteenDaysAfterDate = "2017-07-22";

    assertEquals(fourteenDaysAfterDate, result.toString());
}

この例では、ラムダ式を使用して、日付(2017-07-08)を保持する

localDate

オブジェクトに14日を追加するように

temporalAdjuster

オブジェクトを設定します。

ラムダ式を使用して独自の

TemporalAdjuster

実装を定義することで、2017-07-08の直後に営業日の日付を取得する方法を見てみましょう。しかし今回は、

ofDateAdjuster()

静的ファクトリメソッドを使用します。

static TemporalAdjuster NEXT__WORKING__DAY = TemporalAdjusters.ofDateAdjuster(date -> {
    DayOfWeek dayOfWeek = date.getDayOfWeek();
    int daysToAdd;
    if (dayOfWeek == DayOfWeek.FRIDAY)
        daysToAdd = 3;
    else if (dayOfWeek == DayOfWeek.SATURDAY)
        daysToAdd = 2;
    else
        daysToAdd = 1;
    return today.plusDays(daysToAdd);
});

私たちのコードをテストする:

@Test
public void whenAdjust__thenNextWorkingDay() {
    LocalDate localDate = LocalDate.of(2017, 07, 8);
    TemporalAdjuster temporalAdjuster = NEXT__WORKING__DAY;
    LocalDate result = localDate.with(temporalAdjuster);

    assertEquals("2017-07-10", date.toString());
}


5.2.

TemporalAdjuster

インタフェースを実装することで


TemporalAdjuster

インターフェースを実装することで、2017-07-08以降の稼働日を取得するカスタム

TemporalAdjuster

を作成する方法を見てみましょう。

public class CustomTemporalAdjuster implements TemporalAdjuster {

    @Override
    public Temporal adjustInto(Temporal temporal) {
        DayOfWeek dayOfWeek
          = DayOfWeek.of(temporal.get(ChronoField.DAY__OF__WEEK));

        int daysToAdd;
        if (dayOfWeek == DayOfWeek.FRIDAY)
            daysToAdd = 3;
        else if (dayOfWeek == DayOfWeek.SATURDAY)
            daysToAdd = 2;
        else
            daysToAdd = 1;
        return temporal.plus(daysToAdd, ChronoUnit.DAYS);
    }
}

それでは、テストを実行しましょう。

@Test
public void whenAdjustAndImplementInterface__thenNextWorkingDay() {
    LocalDate localDate = LocalDate.of(2017, 07, 8);
    CustomTemporalAdjuster temporalAdjuster = new CustomTemporalAdjuster();
    LocalDate nextWorkingDay = localDate.with(temporalAdjuster);

    assertEquals("2017-07-10", nextWorkingDay.toString());
}


6. 結論

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

TemporalAdjuster

とは何か、定義済みの

TemporalAdjusters

、それらの使用方法、およびカスタム

TemporalAdjuster

実装を2つの異なる方法で実装する方法について説明しました。

このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/java-dates[over on GitHub]にあります。