Joda Time vs Java Time


19

Jodaは豊富な機能を備えており、標準のJava時間よりも洗練されていますが、常に使用するのが最善とは限りません。JavaコードでJoda TimeとJava Timeのどちらを使用すべきかを判断するにはどうすればよいですか?

要件に応じて適切なガイドラインを選択する方法を示すガイドラインがありますか?


5
Java 8に含まれる新しいDate&Time APIを使用し、両方の世界の最高を手に入れてください。Joda Timeの影響を強く受けています。実際、主な著者はJoda Timeの著者であるStephen Colebourneです。
ヨアヒムザウアー

1
@JoachimSauer最終リリースに登場しましたか、それともJava 8の起動時に発生しますか?
m3th0dman

@ m3th0dman:Java 8の最終リリースに含まれますが、まだリリースされていません。GAは現在2013-09-09に予定されています。
ヨアヒムザウアー

Joda -Timeクラスと元のJava日時クラスの両方は、Java 8、Java 9、およびそれ以降に組み込まれたjava.timeクラスによって時代遅れになりました。
バジルブルク

回答:


29

Joda Timeは、次の例外を除き、Javaタイムライブラリに対する改善点であり、ほぼ常に正しい選択です。

  1. プロジェクトにサードパーティの依存関係を追加することが困難または望ましくない場合

  2. パブリックインターフェイスで使用すると問題が発生する場合(たとえば、ORMにjavaとJodaの両方の時間フィールドを処理させる)

ただし、2)の場合、可能であれば内部でJodaを使用することをお勧めします。

上記のことは覚えておく価値がありますが、まれであるべきです。疑わしい場合は、Jodaを使用してください。


「Jodaを内部で使用する」という意味を教えてください。私は初心者であり、これらすべてを知っているわけではありません。
ジェダイナイト

5
@Jedi Knight:アプリケーションは独自のロジックにJodaを使用し、それを必要とする外部システムと通信する場合にのみjava.util.Dateとの間で変換を行うことを意味します。
マイケルボルグワード

2
「内部」とは、アプリケーション全体の内部(Michaelの例のように)のこともありますが、クラスまたは特定のメソッドの内部のこともあります。たとえば、2つのJava Dateオブジェクトを受け取り、それらの間の稼働日数を計算するユーティリティメソッドがあるとしますが、バグが含まれています。修正するには、代わりにJodaTimeを使用してメソッドを書き直す方が簡単かもしれませんが、メソッドを呼び出すすべてのコードをリファクタリングする時間がないため、メソッドシグネチャを変更しないでください。この場合、そのメソッドでJodaを「内部的に」使用しています。
ロバートジョンソン

FYI、ジョダタイムプロジェクトは、今でメンテナンスモードへの移行を助言チームと、java.timeのクラス。Oracleのチュートリアルを参照してください。
バジルブルク

13

Joda-Time Webサイトには次のように記載されていることに注意してください。

Java SE 8より前の標準の日時クラスは貧弱です。この問題に真正面から取り組むことで、Joda-TimeはJavaの事実上の標準日時ライブラリになりました。Java SE 8以降では、ユーザーはjava.time(JSR-310)に移行するよう求められます。

http://www.threeten.org/に関連付けられているGitHubリポジトリに見られるように、Joda -Timeの主要な貢献者であるjodastephenもJSR-310の主要な貢献者です。ところで、jodastephenにもSOハンドルがあります...

Java 8以降で提供されている新しいDate and Time APIを使用して、安心して安心できると述べることは安全だと思います。

いくつかの追加の参照:


12

Java標準日付APIは基本的に壊れているため、Joda TimeをJVMのライブラリ拡張に単純に追加して、残りのJava APIとともにデフォルトでクラスパスにロードすることを検討することがよくあります。

従来のJavaアプリケーションに国際化とタイムゾーンを後付けする作業を経験し、標準のJava APIのみを使用しようとしたことがある場合は、その意味が理解できます。数千行のコードを100行未満に変換することができました。生産性の向上は考えられません。

さらに、標準のDate APIは直感的ではなく、流動的なJoda APIは数週間ではなく数時間で取得できます。2マイル離れた島に行こうとするあなたの例えは、次のようなものです。

1)わずか6分で島に到着するモーターボート。

または...

2)バレーボールを親友とするクレイジーな男が操縦するハリケーンの間に、つると結び付けられた仮設の竹のいか​​だ。

他の回答が述べているように、HibernateにはJoda型Beanプロパティをデータベースの日付/時刻フィールドにマッピングできるプラグインがあるため、ORMなどのいくつかの欠点が存在しなくなっています。JPAにもこれに対する回答があるかもしれません。

あなたのアプリケーションがディスクスペースに関係するデスクトップアプリケーションとして最小限のフットプリントを持つことを望むなら、おそらくJavaは正しい言語選択でさえないでしょう。


FYI、ジョダタイムプロジェクトは、今でメンテナンスモードへの移行を助言チームと、java.timeのクラス。Oracleのチュートリアルを参照してください。
バジルブルク

8

もう1つのポイント: Java-Time(つまりDate)はThreadSafeではありませんが、JodaTimeはそうです。 JodaTimeは、次のような要件がある場合に推奨されます

  • 共通リソースにアクセスするマルチスレッド環境
  • 状況のような集中時刻同期

または、単純なアプリケーションの場合はJava-Timeで問題ありません。


DateTimeでもThreadSafeではありませんか?間違っている場合は修正してください。
vintesh

3
DateTimeクラスを含むJodaライブラリの大部分は不変であるため、スレッドセーフです。ただし、スレッドセーフではない可変クラスがいくつかあります。joda-time.sourceforge.net/faq.html#threadingを参照してください。
ロバートジョンソン

1
スレッドセーフjava.timeは、不変性によって実装されます。stackoverflow.com/questions/9303532/…を参照してください。これは、単純なアプリケーションと複雑なアプリケーションの両方に適しています。api docでさえ、「すべてのクラスは不変でスレッドセーフである」(文字通り2番目の段落から引用)と述べています。java.util一方、古いクラスにはいくつかの問題があります。この答えは後者について言及していることを理解していますが、今ではその区別をすることが重要です。
ヨーヨー

日付時刻を不変の値として表さないのは、非常識です。私はそれが今修正されていることを知っていますが、本当に彼らは世界で何を考えていましたか?
アルアンハダッド

2

java.timeのフレームワークでは、置き換えの両方レガシー日時クラスとジョダタイムを

更新:最も古いバージョンのJavaに同梱されていた古い日時クラスはレガシーになり、Java 8、Java 9以降に組み込まれたjava.timeクラスに正式に取って代わりました

DateCalendarSimpleDateFormat、およびjava.sql.*日時のクラスはすべて避けるべきです。これらの紛らわしい、面倒な、設計が不十分なクラスを使用する必要はありません。これらは完全にjava.timeクラスに置き換えられています。現在の唯一の目的は、既存の古いコードを維持することです。古いコードとインターフェイスする場合、古いクラスに追加された新しいメソッドを呼び出すことにより、java.timeとの間で変換できます。変換の詳細については、「java.util.Dateを「java.time」型に変換する」を参照してください

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。Joda-Timeプロジェクトはjava.timeフレームワークに影響を与えました。どちらも同じ男、スティーブン・コルボーンが率いています。java.timeはJoda-Timeの書き直し/再設計と考えることができます。すべての新しいコードですが、業界初の包括的で洗練された日時ライブラリの構築から長年にわたって学んだことを使用しています。

詳細については、Oracleチュートリアルを参照してください。また、多くの例と説明についてはStack Overflowを検索してください。

java.time機能の多くは、ThreeTen -Backportの Java 6および7にバックポートされ、さらにThreeTenABPのAndroidに適合します使用方法を参照してください...)。

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性のある証明の場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを

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