Java
java8

LocalDateTimeの時刻を特定の時刻に設定する

Java8から追加されたDate Time API。この中にあるLocalDateTimeを使って書いたコードで、時にこんなコードを見かける。

各フィールドを逐一設定する.java
LocalDateTime ldt = LocalDateTime.now().withHour(12).withMinute(0).withSecond(0).withNano(0);

「今日の12時」のような設定なのだが、時刻の各フィールドを一つ一つ設定している。
まあCalendar使ってた時は基本的に一つ一つの設定だったから流れでこうなったのかもしれない。
しかし、これはwithXxx()のたびに新規インスタンスが生成されて効率が悪い。

こんな時に使うのがLocalDateTime#withだ。

public LocalDateTime with(TemporalAdjuster adjuster)
この日付/時間の調整済のコピーを返します。
これは、日付/時間を調整して、この日付/時間に基づくLocalDateTimeを返します。調整は、指定されたアジャスタ戦略オブジェクトを使用して行われます。どのような調整が行われるかを理解するには、アジャスタのドキュメントを参照してください。

TemporalAdjusterとはあまりなじみがないが、ここでは単純に次のような使い方だけ紹介する。

一発で12時に設定する.java
LocalDateTime ldt = LocalDateTime.now().with(LocalTime.of(12, 0));

LocalTimeもこのTemporalAdjusterを実装しているため、withメソッドに渡すことができる。
そして、LocalDateTimeのインスタンスが持つ時刻を引数の時刻に変更してくれるのだ。