Javaの日付と時刻のクラスを使用する必要がありますか、それともJoda Timeなどのサードパーティライブラリを使用する必要がありますか?


147

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

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


5
コメントを明確にするために…Joda-Timeが継続している間、その後続のJSR 310:Date and Time APIは、java.timeパッケージの下でJava 8の一部になるようにスケジュールされてます。Oracleにはチュートリアルのドラフトがあります。JDBC 4.2 新しいデータ型を処理します。
バジルブルク2013年

回答:


197

編集:Java 8がリリースされたので、それを使用できる場合は、リリースしてください!java.time私の考えでは、ジョーダタイムよりもきれいです。ただし、Java-8より前のバージョンでスタックしている場合は、以下を読んでください...

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

長所:

  • とてもうまくいきます。Jodaのバグは標準のJavaライブラリよりもはるかに少ないと私は強く思います。Javaライブラリのバグの一部は、設計上、修正が(不可能ではないにしても)非常に困難です。
  • これは、日付/時刻の扱いを正しい方法で考えるように設計されています-「現地時間」(たとえば、「どこにいても午前7時に起こしてください」)と瞬間(「私はジェームズと呼んでいます」)の概念を分離する午後3時PST。午後3時ではないかもしれませんが、それは同じ瞬間です)」
  • 私は、それはそれが簡単にタイムゾーンデータベースを更新することができます信じていない比較的頻繁に変化します
  • それは人生になり、良好な不変性の物語、持っているたくさん簡単にIMEを。
  • 不変性から始まって、すべてのフォーマッターはスレッドセーフです。これは、ほとんど常にアプリケーションを通じて単一のフォーマッターを再利用したいので素晴らしいです
  • java.timeJava 8での学習は、少なくともある程度は似ているので、すぐに始めることができます。

短所:

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

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

  • それは仕事です。それがあなたのためにすでに行われているのに、なぜ働くのですか?
  • チームの初心者は、自社開発のAPIよりもJodaに慣れている可能性がはるかに高い
  • あなたは、最も単純な用途を超えて何かのためにそれを誤解する可能性があります...そして、最初は単純な機能だけが必要だと思っていたとしても、これらのものは、一度に少しずつ、より複雑になる傾向があります。日付と時刻の操作を適切に行うことは困難です。さらに、組み込みのJava APIを適切に使用することは困難です。カレンダーAPIの日付/時刻の計算がどのように機能するかについてのルールをご覧ください。最初に適切に設計されたライブラリを使用するよりも、これらの上に何かを構築することは悪い考えです。

5
@adi:更新-それはまだ有効ですが、うまくいけば、 JSR-310は、Java 8の一部になりますが、それは、Java 7の一部ではなかった
ジョンスキート

2
@JonSkeetこれはおそらく、java-8の導入以降に更新されるはずです
Sionnach733

@ Sionnach733:すべてを更新するわけではありませんが、最初に何かを追加します。
Jon Skeet

2
バックポートがありjava.time.*ます。Java 6と7のためのthreeten.org/threetenbp
悪党

24

まあ、Java 8を待つつもりがない限り、日付と時刻を操作するためのより良いAPIを実装することを期待しているので、はい、Joda-Timeを使用してください。時間を節約し、多くの頭痛の種を避けます。


長所と短所?私はジョーダの時間を使ったことがありません-人々がそれについて好きなものを聞くのは面白いでしょう。
マックス・スチュワート

15

答えは:それは異なり

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

個人的には、JODAは自分が必要とするものの複雑さの観点からは一歩遠すぎると感じました。標準のJava DateおよびCalendarクラスの2つの主要な(IMHO)ミスは次のとおりです。

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

これらはJODAで対処されていますが、YearMonthDayandの独自のクラスをロールするのは非常に簡単であることがわかりますInstant。そうすれば、100クラスを超えるAPI、別のフォーマット/解析メカニズムなどに慣れる必要はありません。

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

JSR-310仕様のリードは、JODAを最初に書いたStephen Colebourneであり、JODAに論理的に取って代わります。


16
非専門家、IMOによって再発明されるべきではありません
Jon Skeet、

6
私も馬鹿ではありませんが、Java D&T APIに関してはまだ問題がありました。それらは誤用しがたいほど簡単です。人々がJodaを適切に使用できる可能性が高い理由は、Jodaがより適切に設計されているためです。
Jon Skeet、

6
日付/時刻APIに関しては、自分の専門家を信頼しています。これは、他の誰も使用していないランダムなサードパーティAPIのようではありません。"> 100クラス"の引数はわざとらしく、すべてを学ぶ必要がないのは明らかです。
Jon Skeet、

5
私たちは異なることに同意する必要があると思います。専門家によって書かれ適切に設計された、信頼できる日付/時刻。これにより、時間の計算で汚い仕事をする必要がなくなり、私の観点からは「必須」と見なされます。昨年、私は情熱を持って人間の時間測定を嫌うことを学びました。
Jon Skeet、

5
Jodaが存在するときに自分でロールするのは、ひどい考えです。しないでください。Jodaには使用しないクラスが数十あることは事実ですが、これに対する答えは非常に単純です-不要なクラスを使用しないでください。このタイプの独自のライブラリを作成する際に問題が発生する可能性が非常に多くあります。開発とテストの両方において、多大な労力を費やす必要があります。または、ライブラリを1つだけ追加することもできます。次に、Jodaには、チームの新入社員が以前にそれを使用したことがあるという追加の利点がありますが、彼らはあなたの自家製ライブラリーを使用していません。
Dawood ibnカリーム

7

それはすべて、日付で何をしているのかに依存します。単にそれらを永続化する場合は、Javaの組み込みDatesを使用して、必要なことをすべて実行できます。ただし、時間の日付を広範囲に操作している場合は、おそらくJodaの方が適しています。


7

次の理由により、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/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.