新しい Date&Time API を学習しようとしています。私のコードは最後の行を除いて機能しています:
LocalDate current=LocalDate.now();
System.out.println(current);
LocalDate personaldate=LocalDate.of(2011,Month.AUGUST, 15);
System.out.println(personaldate);
LocalDate afterten=current.plus(Period.ofDays(10));
System.out.println(afterten);
// error occurs here
System.out.println(afterten.plus(Duration.ofDays(3)));
期間を日数で追加しようとすると、エラーが発生します。誰かが私が理由を理解するのを手伝ってくれる?
エラー:
Exception in thread "main" Java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds
at Java.time.LocalDate.plus(LocalDate.Java:1241)
at Java.time.LocalDate.plus(LocalDate.Java:137)
at Java.time.Duration.addTo(Duration.Java:1070)
at Java.time.LocalDate.plus(LocalDate.Java:1143)
at TestClass.main(TestClass.Java:15)
デュレーションは、時間ベースの値(秒、ナノ秒)を使用して時間を測定します。期間は、日付ベースの値(年、月、日)を使用します。ここにリンクがあります
https://docs.Oracle.com/javase/tutorial/datetime/iso/period.html
jodaTimeと同じ
受け入れられた答えは完全に正しいですが、私がこの質問にたどり着いたとき、私は自分の問題に対する簡単な解決策を探していました。
Periodを使用しても、2つのLocalDateオブジェクト間の日数をカウントできないことがわかりました。 (2つの間の年数、月数、日数を教えてください。そうですが、日数だけではありません。)
しかし、私が求めていた結果を得るには、LocalDateメソッド「atStartOfDay」を各オブジェクトに追加するのと同じくらい簡単でした。
だから私の誤ったコード:
long daysUntilExpiry = Duration.between(LocalDate.now(), training.getExpiryDate()).toDays();
単に次のように調整されました:
long daysUntilExpiry = Duration.between(LocalDate.now().atStartOfDay(), training.getExpiryDate().atStartOfDay()).toDays();
これを行うと、オブジェクトが、Durationで使用できるLocalDateTimeオブジェクトになります。どちらのオブジェクトも「時間」の部分として1日の始まりがあるため、違いはありません。
これが他の誰かに役立つことを願っています。
//(year,month,day)
LocalDate beginDate = LocalDate.of(1899,12,31);
LocalDate today = LocalDate.now();
ChronoUnit.DAYS.between(beginDate, today)
前に示唆したように、期間は常に秒ベースですが、期間はその日を概念として尊重します。 LocalDateに秒を追加しようとすると、コードは例外をスローします。これも日ベースです。
このようにコードを変更すると、違いがわかります。数日以内に瞬時に取得する場合は、LocalDateTimeを使用してください。
LocalDateTime current = LocalDateTime.now();
System.out.println(current);
LocalDateTime afterten = current.plus(Period.ofDays(10));
System.out.println(afterten);
// error occurred here - but with LocalDateTime is resolved!
System.out.println(afterten.plus(Duration.ofDays(3)));