1. ホーム
  2. java

java.timeで分単位や時間単位で継続時間を取得できないのはなぜですか?

2023-07-18 16:19:40

質問

Duration クラスで、新しい JSR 310 日付 API ( java.timeパッケージ ) は、Java 8 以降で利用可能であると javadoc に記載されています。

このクラスは、量や時間の量を秒やナノ秒の単位でモデル化します。 ナノ秒の単位でモデル化します。 分や時間といった他の継続時間ベースの単位を使用してアクセスすることができます。 分や時間など .さらに、DAYS単位を使用することができ、24時間と正確に等しいものとして扱われるため、夏時間の影響を無視することができます。

では、なぜ次のコードはクラッシュするのでしょうか?

Duration duration = Duration.ofSeconds(3000);
System.out.println(duration.get(ChronoUnit.MINUTES));

これは UnsupportedTemporalTypeException :

java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Minutes
    at java.time.Duration.get(Duration.java:537)

では、デュレーションオブジェクトから分と時間を抽出する推奨される方法は何でしょうか?秒数から自分で計算する必要があるのでしょうか?なぜそのような実装になっているのでしょうか?

どのように解決するのですか?

"なぜそのような実装になったのでしょうか?

他の回答では toXxx() メソッドを使用して時間/分を照会することができます。私はその理由を扱うようにします。

TemporalAmount インタフェースと get(TemporalUnit) メソッドはかなり遅い段階で追加されました。私自身は、その領域で設計を行う正しい方法について十分な証拠を持っていると完全に確信していたわけではありませんが、少し腕まくりをされて TemporalAmount . そうすることで、APIを少し混乱させたと思っています。

今にして思えば、私は TemporalAmount には正しいメソッドが含まれていると思いますが、私は get(TemporalUnit) は別のメソッド名を持つべきでした。その理由は get(TemporalUnit) は本質的にフレームワークレベルのメソッドであり、日常的に使用するようには設計されていないからです。残念ながら、このメソッド名 get というメソッド名はこのことを暗示しておらず、結果として get(ChronoUnit.MINUTES) の上で Duration .

ということで、考え方としては get(TemporalUnit) として量を見る低レベルのフレームワークを想像することです。 Map<TemporalUnit, Long> ここで DurationMap のキーを持つサイズ 2 の SECONDSNANOS .

同じように、方法で。 Period は低レベルのフレームワークから見ると Map というサイズになります。 DAYS , MONTHSYEARS (これは幸いにもエラーの可能性が低いです)。

全体として、アプリケーションのコードに対する最良の助言は、メソッドを無視することです。 get(TemporalUnit) . 使用方法 getSeconds() , getNano() , toHours()toMinutes() の代わりに

最後に、"hh:mm:ss" を取得する一つの方法についてです。 Duration を行うことです。

LocalTime.MIDNIGHT.plus(duration).format(DateTimeFormatter.ofPattern("HH:mm:ss"))

全くきれいではありませんが、1日未満の期間については動作します。

新しい to…Part メソッドがJava 9に追加されました。

JDK-8142936 の各部分にアクセスするための以下のメソッドを追加し、Java 9 で実装されました。 Duration .

  • toDaysPart
  • toHoursPart
  • toMinutesPart
  • toSecondsPart
  • toMillisPart
  • toNanosPart