web-dev-qa-db-ja.com

Java 8 Java.timeクラスにgetMillis()メソッドがないのはなぜですか?

Java 8のパッケージJava.timeには、日付と時刻用のまったく新しいライブラリがあります。これは、以前にJodaTimeを使用したことがある、または独自の日付処理ヘルパーメソッドを作成するのに苦労したことがある人にとって非常に歓迎されます。このパッケージの多くのクラスはタイムスタンプを表し、タイムスタンプから時間を取得するgetHour()、タイムスタンプから分を取得するgetMinute()、タイムスタンプからナノを取得するgetNano()などのヘルパーメソッドがあります等...

タイムスタンプのミリ秒を取得するgetMillis()というメソッドがないことに気づきました。代わりに、メソッドget(ChronoField.MILLI_OF_SECOND)を呼び出す必要があります。私にはそれは図書館の矛盾のように思えます。 そのようなメソッドが欠落している理由を誰かが知っていますか、またはJava 8がまだ開発中であるため、後で追加される可能性がありますか?

https://docs.Oracle.com/javase/8/docs/api/Java/time/package-summary.html

ここで定義されているクラスは、インスタント、期間、日付、時刻、タイムゾーン、期間など、日付と時刻の主要な概念を表しています。これらはISOカレンダーシステムに基づいています。ISOカレンダーシステムは、デファクトワールドカレンダーであり、先発的なグレゴリオの規則に従っています。すべてのクラスは不変であり、スレッドセーフです。

各日時インスタンスは、APIによって便利に使用できるようになっているフィールドで構成されています。フィールドへの下位レベルのアクセスについては、Java.time.temporalパッケージを参照してください。各クラスには、あらゆる種類の日付と時刻の印刷と解析のサポートが含まれています。カスタマイズオプションについては、Java.time.formatパッケージを参照してください...

この種のクラスの例:
https://docs.Oracle.com/javase/8/docs/api/Java/time/LocalDateTime.html

2007-12-03T10:15:30のように、ISO-8601カレンダーシステムでタイムゾーンのない日時。

LocalDateTimeは、日時を表す不変の日時オブジェクトであり、多くの場合、年、月、日、時、分、秒と表示されます。年、曜日、週など、その他の日付と時刻のフィールドにもアクセスできます。時間はナノ秒の精度で表されます。たとえば、「2007年10月2日13:45.30.123456789」という値は、LocalDateTime...に格納できます。

65
Tarmo

JSR-31 はミリ秒ではなくナノ秒に基づいています。したがって、賢明なメソッドの最小セットは、時間、分、秒、ナノ秒に基づいています。ナノ秒のベースを持つという決定は、プロジェクトの最初の決定の1つであり、私は正しいと強く信じています。

ミリ秒のメソッドを追加すると、ナノ秒のメソッドと重複しますが、これは明白な方法ではありません。ユーザーは、ナノフィールドがたとえばナノ秒またはミリナノであるかどうかを考える必要があります。紛らわしいメソッドを追加することは望ましくないため、メソッドは省略されました。指摘したように、代替のget(MILLI_OF_SECOND)を使用できます。

FWIW、私は将来的にgetMillis()メソッドを追加することに反対するでしょう。

63
JodaStephen

OpenJDKの一部になる前は、threetenはgithubにあり、その前はsourceforgeにありました。当時、jsr-310の仕様リーダーであるStephen Colebourneが、まだ sourceforgeサイトで を見つけることができる調査を行いました。

_The fourth question on the survey covered the method names for LocalTime:
1) getHourOfDay(), getMinuteOfHour(), getSecondOfMinute(), getNanoOfSecond()
2) getHour(), getMinute(), getSecond(), getNanoOfSecond()
3) getHour(), getMinute(), getSecond(), getNano()
4) another idea
_

回答4を選択したのはわずか6.23%で、そのうちの約15%がgetMillis()を要求しました。つまり、総投票数の1%未満でした。

おそらくそもそもgetMillisが存在せず、openjdkメーリングリストに関連する情報が見つからなかったため、後でこの問題については明らかに議論されませんでした。

20
assylias

あいまいでないUTC時間(Instant、OffsetDateTime、ZonedDateTime)を表すクラスには、Java Epoch、つまりJavaで「ミリ秒時間」と呼ぶもの)からの絶対オフセットにアクセスするための2つのヘルパーメソッドがあります。 .util.Date。ミリ秒で取得するために使用できます。

_long getEpochSecond()
int getNano()

1000L*getEpochSecond() + getNano() / 1000000L;
_

これがlong getEpochMillis()の代わりに選択された理由についてのいくつかの理由が jsr 310メーリングリスト で議論されました。

ミリ秒単位の精度では十分ではないと考えるのが妥当だと思われます。ただし、ナノ秒の精度を超えるものは過剰に見える

...

これを実装するために、私の推奨オプションは64ビット長秒(符号付き)+ 32ビット整数ナノ秒(符号なし)です。

...

それは科学における公式のSI時間単位であり、最も普遍的に合意された基準であるため、私は2番目のレベルでの分割を好みます。

日レベルでの分割は、うるう秒を処理しないため、インスタントにとって問題があります。ミリ秒レベルで分割することは、残りのJavaとわずかにうまく統合されますが、実際にはかなり奇妙に見えます。さらに、サポートされている範囲で負けます。

提案された秒での分割は、2900億年以上のさまざまな瞬間のナノ秒を提供します。タイムラインのその範囲でこの精度を使用することはできませんが、ブロックするよりサポートする方が簡単であることをお勧めします。うるう秒を処理しないため、インスタントの場合、日レベルでの分割は問題があります

別の理由は、Java.util.DateからJSR310クラスへの変換を意図的に困難にすることであると感じています。開発者がさまざまなオプションの違いを理解し、単に新しいクラスを盲目的に(誤)使用するのではないことを期待しています。

LocalDateTimeクラスにこれらのメソッドがない理由について-LocalDateTimeは、どのゾーンにいるか、または何をしているかを決定するまで、UTCタイムラインに関連付けられていないため、そこに存在する可能性はありません。 UTCオフセットは、その時点でOffsetDateTimeまたはZonedDateTimeです(どちらにも必要なメソッドがあります)。

または、独自の_LOCAL_Epoch_定数を_1970-01-01T00:00:00_に定義してから、MILLIS.between(LOCAL_Epoch, localTime)を実行して、ミリ秒単位の期間を取得することもできます。ただし、もちろん、ローカル時間をUTC時間として定義しない限り、この値はSystem.currentTimeMilliseconds()またはJava.util.Date.getTime()によって返される値と互換性がありません。ただし、この場合は、Instantを直接使用するか、ZoneOffset.UTCでOffsetDateTimeを使用することもできます。

16
mkadunc