Jodaは豊富な機能を備えており、標準のJava時間よりも洗練されていますが、常に使用するのが最善とは限りません。JavaコードでJoda TimeとJava Timeのどちらを使用すべきかを判断するにはどうすればよいですか?
要件に応じて適切なガイドラインを選択する方法を示すガイドラインがありますか?
Jodaは豊富な機能を備えており、標準のJava時間よりも洗練されていますが、常に使用するのが最善とは限りません。JavaコードでJoda TimeとJava Timeのどちらを使用すべきかを判断するにはどうすればよいですか?
要件に応じて適切なガイドラインを選択する方法を示すガイドラインがありますか?
回答:
Joda Timeは、次の例外を除き、Javaタイムライブラリに対する改善点であり、ほぼ常に正しい選択です。
プロジェクトにサードパーティの依存関係を追加することが困難または望ましくない場合
パブリックインターフェイスで使用すると問題が発生する場合(たとえば、ORMにjavaとJodaの両方の時間フィールドを処理させる)
ただし、2)の場合、可能であれば内部でJodaを使用することをお勧めします。
上記のことは覚えておく価値がありますが、まれであるべきです。疑わしい場合は、Jodaを使用してください。
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を使用して、安心して安心できると述べることは安全だと思います。
いくつかの追加の参照:
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は正しい言語選択でさえないでしょう。
もう1つのポイント:
Java-Time(つまりDate
)はThreadSafeではありませんが、JodaTimeはそうです。
JodaTimeは、次のような要件がある場合に推奨されます
または、単純なアプリケーションの場合はJava-Timeで問題ありません。
java.time
は、不変性によって実装されます。stackoverflow.com/questions/9303532/…を参照してください。これは、単純なアプリケーションと複雑なアプリケーションの両方に適しています。api docでさえ、「すべてのクラスは不変でスレッドセーフである」(文字通り2番目の段落から引用)と述べています。java.util
一方、古いクラスにはいくつかの問題があります。この答えは後者について言及していることを理解していますが、今ではその区別をすることが重要です。
更新:最も古いバージョンのJavaに同梱されていた古い日時クラスはレガシーになり、Java 8、Java 9以降に組み込まれたjava.timeクラスに正式に取って代わりました。
Date
、Calendar
、SimpleDateFormat
、および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に将来追加される可能性のある証明の場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。