java.timeで分単位や時間単位で継続時間を取得できないのはなぜですか?
質問
の
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>
ここで
Duration
は
Map
のキーを持つサイズ 2 の
SECONDS
と
NANOS
.
同じように、方法で。
Period
は低レベルのフレームワークから見ると
Map
というサイズになります。
DAYS
,
MONTHS
と
YEARS
(これは幸いにもエラーの可能性が低いです)。
全体として、アプリケーションのコードに対する最良の助言は、メソッドを無視することです。
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
関連
-
[解決済み] リストから要素を削除しようとすると、UnsupportedOperationExceptionが発生するのはなぜですか?
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
無効なメソッド宣言
-
配列定数は初期化子でのみ使用可能です。
-
eclipse にリソースリーク:'in' が閉じない
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] なぜJavaでは静的メソッドを抽象化できないのですか?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
プロジェクトの依存関係を解決できない。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
無効な文字定数
-
無効なメソッド宣言
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
コンストラクタDate()が未定義である問題
-
テストが空であるかどうかを判断するためのオプションの処理