異なるフォーマットからの二つの日付を比較します

ユーセフ:

それらが等しいかどうかを確認するためにさまざまな形式から、この二つの日付を比較する方法

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を比較する必要はありません)として日付としてそれを比較します

オレVV:

あなたの二つの日付が異なるフォーマットを持っているということは本当に正確ではありません。AはDateフォーマットを持っていません。あなたは、あなたが日付を印刷するかを見ることは自分からの戻り値であるtoString方法。

むしろ、あなたの日付が異なる持っているランタイム型をd1インスタンスでありjava.util.Date、そのtoString方法は、フォーマットを生成Sat May 25 10:00:00 WET 2019d2今度はのインスタンスですjava.sql.Dateそれはのサブクラスですjava.util.Dateので、この型の変数に割り当てることができます。java.sql.Date.toString()フォーマットを生成します2019-05-25しかし、サブクラス(継承)関係を使用すると、コード内に頼るべきではないとハックです。

継承のハックは、しかし、これら二つのクラスを持つ多くの設計上の問題のひとつ出ています。幸い、新しい、より現代的な交換は両方のために存在します。以下のためにjava.util.Date近代的なInstantクラスのあなたのより正確な要件に依存して使用する1つ正確に最も直接的に対応するタイプが、あります。以下のためにjava.sql.Date、それは簡単です、使用LocalDate両方InstantLocalDatejava.time、近代的なJavaの日付と時刻のAPIの一部です。

あなたは置き換えることができますのであれば見るbean.fooDateことでInstantjava.timeから、または他の適切な近代的なタイプ。あなたが得ることができるならば同様に見fooEntity.getFooDate()返すことLocalDateHibernateは扱うことが幸せでなければならない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.Datejava.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を使用する方法を説明します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=337816&siteId=1