web-dev-qa-db-ja.com

Joda時間を使用して2つの日付を比較する

2つの日付を比較したいのですが、問題が発生しています。 1つの日付はJava.util.dateオブジェクトから作成され、もう1つの日付は手動で作成されます。次のコードは例です。

Date ds = new Date();
DateTime d = new DateTime(ds);

DateTime e = new DateTime(2012,12,07, 0, 0);
System.out.println(d.isEqual(e));

ただし、テストはfalseになります。時間のせいだと思います。これらの2つの日付が互いに等しいかどうかを確認するにはどうすればよいですか(年、月、日付が同一であることを意味します)?

30
Marc Rasmussen
System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight()));

または

System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay()));
48
JB Nizet

toLocalDate()を使用する必要があります。

date1.toLocalDate().isEqual(date2.toLocalDate())

これにより、DateTimeのTime部分が削除されます。

別のアプローチもありますが、2つの日付のタイムゾーンが異なる場合は考慮されないため、信頼性が低下します。

date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay())
21
Stan
return DateTimeComparator.getDateOnlyInstance().compare(first, second);

経由 時間部分なしで2つの日付を比較する方法?

6
Vadzim

時間コンポーネントを無視する場合(つまり、日付のみを比較する場合)、Date Timeの代わりにDateMidnightクラスを使用できます。したがって、例は次のようになります。

Date ds = new Date();
DateMidnight d = new DateMidnight(ds);

DateMidnight e = new DateMidnight(2012, 12, 7);
System.out.println(d.isEqual(e));

しかし、注意してください、それは今日のみ「true」を出力します:)

また、デフォルトでは、JDK DateおよびすべてのJoda-Timeインスタントクラス(DateTimeおよびDateMidnightを含む)は、デフォルトのタイムゾーンを使用して構築されます。したがって、コードで比較する日付を1つ作成し、UTCで日付を格納している可能性のあるDBから別の日付を取得すると、UTCタイムゾーンにないと仮定して矛盾が発生する可能性があります。

3
Andrii Polunin

それらはDateTimeオブジェクトであるため、それらを比較する際に時間部分も考慮されます。次のように、最初の日付の時間部分を0に設定してみてください。

d = d.withTime(0, 0, 0, 0);
1
Hiery Nomus

今日との比較を探しているときに、私はこの質問につまずいた。日付を今日と比較する方法は次のとおりです。

date1.toLocalDate().isBeforeNow() // works also with isAfterNow
1
Ismail H

これは静的な方法であり、私にとっては有効です。

public static boolean isSameDay(DateTime date1, DateTime date2){
    return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay());
}
0
BaptisteM