2012-12-07 17 views
25

私は2つの日付を比較したいと思いますが、問題が発生しています。 1つの日付はjava.util.dateオブジェクトから作成され、もう1つは手動で作成されます。次のコードは例です:ジョーダの時間を使って2つの日付を比較する

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つの日付が同じであるかどうかを確認するにはどうすればいいですか(年、月、日付が同じであることを意味します)。

+0

FYI、[ジョダタイム](HTTPの文字列、ロング、日付(java.utilの)...することができます:/ /www.joda.org/joda-time/)プロジェクトは[メンテナンスモード](https://en.wikipedia.org/wiki/Maintenance_mode)になり、チームは[java.time](http ://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary.html)のクラスを参照してください。 [Tutorial by Oracle](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)を参照してください。 –

答えて

44
System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight())); 

または

System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay())); 
+5

toDateMidnight()は推奨されていません。使用しないでください。代わりに、withTimeAtStartOfDay()を使用することはできますが、タイムゾーンを削除しないため最適ではないため、2つの日付が異なる場合は、決して同じではありません。 – Stan

+3

私は 'toLocalDate()'を使っていますが、これは同じ問題があると思います。これを避けるために、 'withZone()'を連鎖させることができます。例: 'd.toLocalDate()。isEqual(e.withZone(d.zone).toLocalDate())'。これはテストされていないことに注意してください。 –

+1

dとeが異なるタイムゾーンの場合、これは機能しません。上記のチャールズウッドの答えはより信頼性が高い –

1

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

d = d.withTime(0, 0, 0, 0); 
-5

あなたは時間コンポーネントを無視したい場合は、独自の方法

public boolean checkEqual(DateTime first,DateTime second){ 
    if(first.<getterforyear> == second.<getterforyear> && first.<getterformonth> == second.<getterformonth> && first.<getterforday> == second.<getterforday>){ 
     return true; 
    } 
return false; 
} 
+0

種類は同じです、慎重に質問をお読みください。どちらもDateTimeです。 –

+2

Joda Timeには、この種のことを行うユーティリティメソッドが数多くあるため、これはまったく必要ありません。 –

3

を書きます(つまり、日付のみを比較したい場合)、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)); 

をしかし、注意してください、それは今日だけ「真」に印刷されます:)

また日時(デフォルトJDKの日付とすべてのジョダタイムインスタントクラスであることに注意し、 DateMidnightを含む)は、デフォルトのタイムゾーンを使用して作成されます。そのため、コードで比較する日付を1つ作成し、UTCで日付を格納するDBから別の日付を取得すると、UTCのタイムゾーンではないと仮定して矛盾が発生する可能性があります。

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

この

は日時の時間部分を取り除くます:

+0

パッケージ時のDateMidnightは非推奨です。提案はlocalDateを使用することです –

+0

すべての深夜関連のクラスとメソッドおよびメソッドは廃止予定で、「最初の瞬間」の概念とメソッドに取って代わりました。 –

15

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

あり、別のアプローチがあるが、それは二つの日付が異なるタイムゾーンを持っている場合を考慮していないので、信頼性の低いです:

date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()) 
0

これは、私のために働く静的な方法。

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

'toLocalDate'を使って、[既存の回答](https://stackoverflow.com/a/21553438/642706)の利点はありません。これを除いて、 'DateTime'オブジェクトが異なるタイムゾーンを持つのに対して、他のアンサーのアプローチはそうではありません。これが良いか悪いかは、ビジネス上の問題によって決まります。 –

-1
DateTimeComparator.getDateOnlyInstance().compare(obj1, obj2); 

obj1とobj2は、詳細がご覧 http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator.html

+1

ようこそスタックオーバーフロー!質問に答える前に、常に既存の回答を読んでください。この回答は既に提供されています。答えを繰り返す代わりに、既存の回答に投票してください。良い回答を書くためのいくつかのガイドラインは、[here](https://stackoverflow.com/help/how-to-answer)で見つけることができます。 – dferenc

関連する問題