JavaのTemporalAdjuster
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]にあります。