こっちのほうが、インスタンスの生成数が少なく済みます。(plusやwithの操作のたびにインスタンスが生成される。)
java
1LocalDateTime now = LocalDateTime.now();
2LocalTime nine = LocalTime.of(9, 0);
3LocalDateTime result = LocalDateTime.of(now.toLocalDate(), nine);
4if (now.toLocalTime().isAfter(nine))
5 result = result.plusDays(1);
6System.out.println(result);
withの引数にLocalTimeが渡せることに気づいて、いろいろ出てきた。mattnさんのをシンプルに書くと
java
1import java.time.*;
2
3public class LT2 {
4 public static void main(String[] args) {
5 LocalDateTime now = LocalDateTime.now();
6 now = now.plusHours(15).with(LocalTime.of(9, 0));
7 System.out.println(now);
8 }
9}
私のコードもこうなる
java
1import java.time.*;
2
3public class LT3 {
4 public static void main(String[] args) {
5 LocalDateTime now = LocalDateTime.now();
6 LocalDateTime result = now.with(LocalTime.of(9, 0));
7 // 時刻を再設定した結果時間が巻き戻った場合、1日足す
8 if (result.isBefore(now)) {
9 result = result.plusDays(1);
10 }
11 System.out.println(result);
12 }
13}
前者がif文もなくすっきり書けるけど、後者は時刻がいつになっても時刻を変えるだけで適用できる。
ちょっと背伸びして、TemporalAdjusterをラムダ式で書いてwithメソッドを使ってみた
java
1import java.time.LocalDateTime;
2import java.time.LocalTime;
3
4public class Q81936 {
5
6 public static void main(String[] args) {
7 LocalDateTime now = LocalDateTime.now();
8 LocalDateTime result = now.with(t -> {
9 LocalDateTime time = LocalDateTime.from(t);
10 LocalDateTime r = time.with(LocalTime.of(9, 0));
11 return t.with(r.isBefore(time) ? r.plusDays(1) : r);
12 });
13 System.out.println(now);
14 System.out.println(result);
15 }
16
17}