42

2 つの日付を date beforeメソッドで比較すると、日付が類似している場合、次のように false が返されます。

  • date1: 2012 年 12 月 18 日火曜日 00:00:00 GMT+02:00
  • date2: 2012 年 12 月 18 日火曜日 00:00:00 GMT+02:00

この場合、メソッドdate1.before(date2)は常に false を返しますが、これは意味がありません (つまり、私の場合には当てはまりません)。日付 (日/月/年) が今日の日付 (日/月/年) と等しいかどうかを確認したいですか?

4

9 に答える 9

89

として、 false を返すのdate1.equals(date2)は正常です。date1.before(date2)するようにdate1.after(date2)

両方の日付は同じであるため、一方が他方より前ではありません。

javadocから:

この Date オブジェクトによって表される時点が when によって表される時点より厳密に早い場合に限り true 。それ以外の場合は false。

次のようなものを試してください:

if(date1.before(date2) || date1.equals(date2)) ...

以下に示す回答は、逆のテストを示唆しており、正しいです。

if(!date1.after(date2)) ...

どちらのテストも同等です。

于 2012-12-18T15:51:33.497 に答える
57

逆を簡単にテストできます:

!date1.after(date2)

この方法で、厳密な順序チェックを非厳密なチェックにいつでも変換できます。数学的に :

a > b ⇔ ¬ (a ≤ b)
于 2012-12-18T19:23:16.073 に答える
8

日付が等しい場合、明らかに一方が他方より前ではありません: false is the correct return for date1.before(date2) where date1 == date2.

平等を含める必要がある場合は、否定を実行してみませんか.after()(明らかに、日付 1 が日付 2 より後でない場合は、等しいか前です)、これが実際に達成しようとしていることの正しいロジックであることを確認します.

同等性が別の方法で処理する必要がある特殊なケースである場合は、別のテストを行い.equals()ます。

于 2012-12-18T16:00:01.193 に答える
6

ボウモアによって提案されたように、逆を使用できます。!date1.after(date2)

または、範囲を探している場合は、その間にエンドポイントを含めることができます。その場合、次のことができますuse return !d.before(min) && !d.after(max)

于 2014-01-03T16:04:15.120 に答える
4

これも使用できます:

boolean check = dateOne.before(dateTwo) || DateUtils.isSameDay(dateOne, dateTwo);

DateUtils はorg.apache.commons.lang.timeパッケージからのものです

于 2015-10-13T08:33:55.520 に答える
1

ある日付が他の日付よりも前dateBeforeかどうかをチェックするため、これはごく普通の動作です。日付が等しい場合、これは明らかに誤りです。

于 2012-12-18T15:51:14.707 に答える
0

使用できますDate.compareTo()

値は次のとおりです。

  1. 両方の日付が等しい場合、戻り値は 0 です。
  2. Date が date 引数より後の場合、戻り値は 0 よりも大きくなります。
  3. Date が date 引数より前の場合、戻り値は 0 未満です。

コード例は次のとおりです。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date1 = sdf.parse("2009-12-31");
        Date date2 = sdf.parse("2010-01-31");

        System.out.println("date1 : " + sdf.format(date1));
        System.out.println("date2 : " + sdf.format(date2));

        if (date1.compareTo(date2) > 0) {
            System.out.println("Date1 is after Date2");
        } else if (date1.compareTo(date2) < 0) {
            System.out.println("Date1 is before Date2");
        } else if (date1.compareTo(date2) == 0) {
            System.out.println("Date1 is equal to Date2");
        } else {
            System.out.println("How to get here?");
        }

詳細については、このスレッドにアクセスしてください

于 2020-08-11T08:03:06.907 に答える
0

2012年の回答は正しく、当時は一般的に良い回答でした。Date最近では、質問で暗示されているクラスよりも、最新の Java の日付と時刻の API である java.time を使用することを確実に好みます。Date設計が不十分で、今では時代遅れになっています。

「前または等しい」比較を取得するための推奨される 2 つの方法は次のとおりです。

  1. 自然で言葉の多いもの:

        OffsetDateTime dateTime1 = OffsetDateTime.of(2012, 12, 18, 0, 0, 0, 0, ZoneOffset.ofHours(2));
        OffsetDateTime dateTime2 = OffsetDateTime.of(2012, 12, 18, 0, 0, 0, 0, ZoneOffset.ofHours(2));
    
        if (dateTime1.isBefore(dateTime2) || dateTime1.isEqual(dateTime2)) {
            System.out.println("dateTime1 is before or equal to dateTime2");
        } else {
            System.out.println("dateTime1 is after dateTime2");
        }
    

    出力は次のとおりです。

    dateTime1 は dateTime2 より前か等しい

    余談OffsetDateTime.isEqual()ですが、UTC オフセット全体で時点、インスタントを比較し、同じ時点を表す 2 つのオブジェクトの true を返します。isBefore()異なる UTC オフセットでも機能します。

  2. 条件を逆にする簡単なもの:

        if (dateTime1.isAfter(dateTime2)) {
            System.out.println("dateTime1 is after dateTime2");
        } else {
            System.out.println("dateTime1 is before or equal to dateTime2");
        }
    

    出力は以前と同じです。

Instant要件によっては、よりもクラスを好むことに簡単に気付くでしょうOffsetDateTimeif条件は同じになります。

昔ながらのクラスを使用するDateか、現代のクラスのいずれかを使用するかに関係なく、厳密にはbeforeを意味します。そのため、 before または equalを取得するには、上記のバリアントのいずれかを使用する必要があります。

于 2020-08-11T19:58:08.023 に答える