web-dev-qa-db-ja.com

Java date and timeクラスを使用するか、Joda Timeなどのサードパーティライブラリを使用する必要がありますか?

私は、世界中の国々で使用されるWebベースのシステムを作成しています。保存する必要があるデータの1つのタイプは、日付と時刻です。

Joda time などのサードパーティライブラリと比較したJava dateおよびtimeクラスを使用することの長所と短所は何ですか? ?これらのサードパーティのライブラリは正当な理由で存在していると思いますが、実際に比較したことはありません。

146
user14070

編集:Java 8がリリースされました。使用できる場合は、そうしてください!Java.time私の見解では、Joda Timeよりもさらにクリーンです。ただし、Java 8より前のバージョンにこだわっている場合は、続きを読んでください...

マックスは、ジョーダを使用することの長所と短所を求めました...

長所:

  • とてもうまくいきます。 Jodaのバグは、標準のJavaライブラリよりもはるかに少ないと思います。Javaライブラリのバグのいくつかは、本当に難しい(不可能でない場合)設計のために修正します。
  • 正しい方法で日付/時刻の処理について考えるように設計されています-「現地時間」の概念(「どこにいても午前7時に起きてください」)と瞬間(「ジェームズに電話している」太平洋標準時午後3時。彼がいる場所は午後3時ではないかもしれませんが、同じ瞬間です」
  • does比較的頻繁に変更されるタイムゾーンデータベースの更新が容易になると思います
  • それは、人生をlotより簡単にするIMEを作る、良い不変性の物語を持っています。
  • 不変性から始まって、すべてのフォーマッタはスレッドセーフです。これは、ほとんどalwaysアプリケーションで単一のフォーマッタを再利用したいので素晴らしいです
  • あなたは学習に有利なスタートを切るJava.time in Java 8、少なくとも多少似ているため)

短所:

  • 学ぶべきもう1つのAPIです(ただし、ドキュメントはかなり優れています)
  • ビルドしてデプロイする別のライブラリです
  • Java 8を使用すると、スキルを移行するための作業がまだ残っています
  • 過去にDateTimeZoneBuilderを効果的に使用することに失敗しました。ただし、これはveryまれなユースケースです。

独自の小さなAPIを効果的に構築するというoxbow_lakesのアイデアに対応するため、これが悪いアイデアである理由についての私の見解を以下に示します。

  • 仕事だ。すでに完了しているのに、なぜ仕事をするのですか?
  • チームの新参者は、自社開発のAPIよりもJodaに精通している可能性が高い
  • 最も単純な用途を超えて何かを間違える可能性があります...そして最初に思考シンプルな機能のみが必要な場合でも、これらのものはより複雑になり、少しずつ成長する習慣があります時間。日付と時刻の操作は、適切に行うためにhardです。さらに、組み込みのJava APIは難しいseが難しい​​-カレンダーAPIの日付/時刻の計算がどのように機能するかのルールを見てください。これらのうち、最初から適切に設計されたライブラリを使用するのではなく、悪い考えです。
196
Jon Skeet

まあ、あなたがJava 8、 より良いAPI 日時を操作するために実装することを望んでいるのを待つつもりがない限り、はい、 Joda-Time 。時間を節約し、多くの頭痛を避けます。

24
gizmo

答えは:依存する

JODA(およびJSR-310)は、複数のカレンダーシステムでの使用のサポートを含む、完全に機能する日付/時刻ライブラリです。

個人的には、JODAは、私が必要とするものの複雑さの観点から、あまりにも大きな一歩であると感じました。標準のJava DateおよびCalendarクラスの2つのプリンシパル(IMHO)の間違いは次のとおりです。

  1. それらは変更可能です
  2. 彼らはインスタントインタイムから年月日という概念を混同します

これらはJODAによって対処されていますが、YearMonthDayおよびInstantの独自のクラスをロールすることは非常に簡単です。両方ともJavaクラスを使用します実際の「カレンダー」計算のフード。100を超えるクラスのAPI、異なるフォーマット/解析メカニズムなどに精通する必要はありません。

もちろん、異なる年表(ヘブライ語など)の完全な表現が必要な場合、または独自の架空のカレンダーシステムを定義したい場合(たとえば、作成中のゲームの場合)、おそらくJODAまたはJRS-310が最適です。そうでない場合は、自分で転がすことをお勧めします。

JSR-310の仕様リードは、JODAを最初に書いたStephen Colebourneであるため、論理的にはreplace JODAになります。

15
oxbow_lakes

次の理由から、Joda-Timeライブラリを使用する必要があります。

  1. Joda-Timeは ISO 8601標準 をサポートしています。これは標準的な方法です
    日付表現。
  2. Joda-Timeでは、Java.util.dateよりも日/月/年の加算と減算が簡単です。
  3. Joda-Timeでは、特定の日付による初期化が非常に簡単です。
  4. Joda-Timeはタイムゾーンもサポートしています。
  5. Joda-Timeには、より優れた解析が組み込まれています。 「2014-02-31」のような誤った日付がエラーとしてスローされます:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

詳細については、このページをご覧ください: http://swcodes.blogspot.com/

7
Guest

それはすべて、あなたが日付で何をしているかに依存します。単純に永続化する場合は、Javaに組み込まれているDatesがおそらくあなたが望むすべてのことを行うでしょう。ただし、広範囲の日時操作を行う場合は、おそらくJodaを使用したほうがよいでしょう。

7
Anthony Roy