web-dev-qa-db-ja.com

ほとんどのJava.util.Dateメソッドが非推奨になったのはなぜですか?

Java.util.Dateクラスのjavadocを見ると、ほとんどのメソッドは非推奨です。なぜこれが行われたのですか?

45
Daniel Kaplan

ええと、2つの関連する理由があります。これは、Dates and Timesの概念の非常に貧弱な実装であり、Calendarクラスに置き換えられました。

Calendarクラスは改善されていますが、多くの要望が残されているため、本格的な日付/時刻の作業には、誰もが Joda-Time をお勧めします。 Java 8 新しい Java.time。*パッケージ をもたらします。これはJoda-Timeに触発され、 JSR-31 で定義され、古い日付/カレンダークラス。

編集:なぜ実装が貧弱なのかという特定の質問に答えて、多くの理由があります。 JavaDocはそれを次のように要約します。

残念ながら、これらの関数のAPIは国際化に適していませんでした。

この一般的な欠陥(タイムゾーンコンポーネントの欠如、DateFormatでより適切に処理される日付の書式設定、非グレゴリオ暦の表現ができないことなどの問題をカバーしています)に加えて、 Dateクラスを本当に傷つける特定の問題。これには、西暦の年から1900年のオフセットで年が表示されるという事実が含まれます。

Calendarには独自の問題がありますが、JDK 1.1の早い段階でさえ、Java.util.Dateそれをカットするつもりはなかった。 Calendarは間違いなく最悪のJDKAPIですが、バージョン7まではそれに対処しようと試みてきました。

44
Yishai
  • Dateは変更可能です
  • Dateはタイムゾーンをサポートしていません

後者の場合、Calendarに置き換えられました。そして、前者は、使いやすさと組み合わされて、両方が Joda-Time / JSR-31Java.time。*)に置き換えられることになります。パッケージ

17
Bozho

彼らがJDKをドアの外に急いで送りたいと思った日に、Dateができるだけ早く書かれたので、それらは非推奨になりました。

日付とカレンダーが難しいことがわかりました。そこで、彼らは、カレンダーの操作の難しい部分を処理するために、はるかに考え抜かれたCalendarクラスを作成しました。

彼らは、既存のDateメソッドの動作を変更したくなかったため、Dateメソッドを非推奨にし、Calendarに委任し、既存のアプリケーションを壊す可能性がありました。

11
Will Hartung

オラクルから直接の良い答えは次のとおりです。 http://www.Oracle.com/technetwork/articles/Java/jf14-date-time-2125367.html

Java開発者の長年のバグベアは、通常の開発者の日付と時刻のユースケースのサポートが不十分でした。

たとえば、既存のクラス(Java.util.DateSimpleDateFormatterなど)はスレッドセーフではないため、ユーザーに同時実行の問題が発生する可能性があります。これは、平均的な開発者が日付を書き込むときに対処することを期待するものではありません。 -処理コード。

一部の日付と時刻のクラスも、非常に貧弱なAPI設計を示しています。たとえば、Java.util.Dateの年は1900から始まり、月は1から始まり、日は0から始まりますが、あまり直感的ではありません。

... Java.util.Dateは、タイムライン上の瞬間(UNIXエポックからのミリ秒数のラッパー)を表しますが、toString()を呼び出すと、結果はタイムラインがあることを示し、混乱を引き起こします。開発者。

2
Daniel Kaplan

非推奨になった公式の理由はわかりませんが、GregorianCalendarand Joda-Time サポート操作を日付で指定できる限り、たとえば追加できます。 、日から日付まで、それに応じて月と年を更新します。

たとえば、現在の日付の翌日を計算し、今日が5月31日であるとします。 _Java.util.Date_を使用すると、32を返すgetDays() +1があり、今月には32日がないという知識を自分で処理する必要があります。 GregorianCalendarまたはJoda.timeを使用して、5月31日に日を追加すると、6月1日を表すオブジェクトが作成され、複雑さが見えなくなります。

0
Raibaz