web-dev-qa-db-ja.com

Duration.ofDaysはUnsupportedTemporalTypeExceptionを生成します

新しい 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)    
12
user2779311

デュレーションは、時間ベースの値(秒、ナノ秒)を使用して時間を測定します。期間は、日付ベースの値(年、月、日)を使用します。ここにリンクがあります

https://docs.Oracle.com/javase/tutorial/datetime/iso/period.html

jodaTimeと同じ

15
Azat Nugusbayev

受け入れられた答えは完全に正しいですが、私がこの質問にたどり着いたとき、私は自分の問題に対する簡単な解決策を探していました。

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)
1
Ravi Jaganathan

前に示唆したように、期間は常に秒ベースですが、期間はその日を概念として尊重します。 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)));
0
avogt