それらが等しいかどうかを確認するためにさまざまな形式から、この二つの日付を比較する方法
Date d1 = bean.fooDate; // >> from a post request
System.out.println(d1); // >> "Sat May 25 10:00:00 WET 2019"
Date d2 = fooEntity.getFooDate(); // >> from mysql database
System.out.println(d2); // >> "2019-05-25"
私はちょうどたくPSはない日時(分&secondesを比較する必要はありません)として日付としてそれを比較します
あなたの二つの日付が異なるフォーマットを持っているということは本当に正確ではありません。AはDate
フォーマットを持っていません。あなたは、あなたが日付を印刷するかを見ることは自分からの戻り値であるtoString
方法。
むしろ、あなたの日付が異なる持っているランタイム型を。d1
インスタンスでありjava.util.Date
、そのtoString
方法は、フォーマットを生成Sat May 25 10:00:00 WET 2019
。d2
今度はのインスタンスですjava.sql.Date
。それはのサブクラスですjava.util.Date
ので、この型の変数に割り当てることができます。java.sql.Date.toString()
フォーマットを生成します2019-05-25
。しかし、サブクラス(継承)関係を使用すると、コード内に頼るべきではないとハックです。
継承のハックは、しかし、これら二つのクラスを持つ多くの設計上の問題のひとつ出ています。幸い、新しい、より現代的な交換は両方のために存在します。以下のためにjava.util.Date
近代的なInstant
クラスのあなたのより正確な要件に依存して使用する1つ正確に最も直接的に対応するタイプが、あります。以下のためにjava.sql.Date
、それは簡単です、使用LocalDate
。両方Instant
とLocalDate
java.time、近代的なJavaの日付と時刻のAPIの一部です。
あなたは置き換えることができますのであれば見るbean.fooDate
ことでInstant
java.timeから、または他の適切な近代的なタイプ。あなたが得ることができるならば同様に見fooEntity.getFooDate()
返すことLocalDate
。Hibernateは扱うことが幸せでなければならないLocalDate
のではなくDate
(あなたのHibernateのバージョンが非常に古いでない限り)あなたのため。
いずれにせよ、スリニバサンスカールはあなたがするからそれぞれ入手どんなタイプに変換する必要があること正しいLocalDate
日付とない時間、分、秒だけを比較します。LocalDate
一日の時間のない日:正確ことがあります。
あなたが得ることを言うInstant
からbean.fooDate
。そして、変換は次のとおりです。
LocalDate localDate1 = bean.fooDate.atZone(ZoneId.of("Africa/El_Aaiun")).toLocalDate();
適切なタイムゾーンを指定してください。
あなたは昔ながらを避けることができない場合はDate
、スリニバサンスカールの答えで変換が正しいです。
LocalDate localDate1 = bean.fooDate
.toInstant()
.atZone(ZoneId.of("Africa/El_Aaiun"))
.toLocalDate();
以下の場合にはfooEntity.getFooDate()
あなたが得ることができれば、LocalDate
上述したように、あなたは完了です。あなただけ得ることができる場合はDate
この方法を返すように宣言されているかどうか、最初のチェックjava.util.Date
やjava.sql.Date
。それはおそらくメソッドが宣言されているファイルで使用される輸入に依存します。以下の場合はjava.sql.Date
(残念ながら常に正しい日付を与えることが保証されていないが)シンプルで十分です。
LocalDate localDate2 = fooEntity.getFooDate().toLocalDate();
宣言された戻り値の型がある場合java.util.Date
、実際に返されたオブジェクトがあると思われることから、あなただけの上記にキャストを追加することもjava.sql.Date
。しかし、最初にあなたの仮定をテストするために、より安全になります:
LocalDate localDate2;
Date d2 = fooEntity.getFooDate();
if (d2 instanceof java.sql.Date) {
localDate2 = ((java.sql.Date) fooEntity.getFooDate()).toLocalDate();
} else {
localDate2 = d2.toInstant()
.atZone(ZoneId.of("Africa/El_Aaiun"))
.toLocalDate();
}
あなたは、後者の場合には、私は上記と同じ変換を使用していますことを認識するであろう。
その結果を比較するために、LocalDate
変数を:
if (localDate1.isEqual(localDate2)) {
System.out.println("Same date");
} else {
System.out.println("Different dates");
}
LocalDate
また、メソッドを持っているisBefore
し、isAfter
場合にあなたは以前であるかを決定する必要があります。
リンク: Oracleのチュートリアル:日付時刻 java.timeを使用する方法を説明します。