2013-07-05 30 views
7

2つの日付を比較したい問題が発生しました。しかし、私は年、月、日を比較したかっただけです。これは私ができることです:ミリ秒、秒、分、および時間を削除する方法

private Date trim(Date date) { 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 
     calendar.set(Calendar.MILLISECOND, 0); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.HOUR, 0); 
     return calendar.getTime(); 
    } 

私はこの機能を使用して、日、月、年を除くすべての単位をトリミングします。

今、あなたはそれについてどう思いますか? 他の方法がありますか?

おかげ

+2

私は本当にどこに問題があるのか​​分からないのですか? –

+0

はきれいなコードのように思えますが、Dateクラスにアクセスする他のコードは、なぜあなたが本当に笑を変えるのでしょうか? – SSpoke

+1

生成しているユーザーのタイムゾーンは、プラットフォームJVMの実行中のタイムゾーンと同じですか? :) – Affe

答えて

2

は、私はあなたが唯一のyearmonthdayを比較したい2つの日付を比較したいと仮定します。

あなたがしたことは問題ありません。具体的には、hourminutesecondmillisecondを削除してください。両方の日付でこれを行う必要があります。

トリミングが完了したら、DateクラスのcompareToメソッドを使用する必要があります。

次のコードを使用することができます -

if(date1.compareTo(date2) < 0) { 
    // date1 is earlier 
} else if(date1.compareTo(date2) > 0) { 
    // date 2 is earlier 
} else { 
    // both dates are equal 
}  
+1

私は本当にそれが必要とは思わない。 date1.before(date2)がよかったようです。 – Adelin

+1

私はあなたに何か助けてくれることを願っています。 – JHS

6

あなたのコードは動作し、読みやすいです。私はそれを変更するための問題や理由は見当たりません。

+0

ありがとうございました。しかし、私は "Stephen C" Answerのような答えを探していました。 – Adelin

4

今、問題は何ですか?

これは単純明快です。新しいDateと一時的なCalendarオブジェクトを作成していますが、これはごくわずかです。 (...大規模なデータ構造をソート/オーダーするためにこれを使用しない限り)

IMO、おそらくそれを変更する必要はありません。

他の方法がありますか?

  1. はそれらのみを抽出するためにCalendarを使用して、興味のあるフィールドを使用していますComparator<Date>を使用/開発します。

    これが役立つかどうかは、現在どのように比較を行っているかによって異なります。コンパレータはそれほど良くないかもしれません。しかし、裏返しになると、を繰り返してに変換することになり、Comparator<Date>は変換された日付をキャッシュするスコープを提供しません。

  2. Date.getTime()によって返された値を使用して計算します。おおよそ次のように:

    long val = date.getTime(); // milliseconds since 'epoch' in UTC 
    val = val + /* local timezone offset in milliseconds */ 
    long day = val/(1000 * 60 * 60 * 24); // days since "local" epoch. 
    
    // repeat for other Date, and compare the 'day' numbers as integers 
    

    説明、Calendar(または何でも)を使用するよりも、いくつかの簡単な計算を行うには、より効率的でなければなりません。コードはもう少しわかりにくいですが、とすれば合理的な数学スキルを持つ人には明らかです。

+0

ありがとう、この答えは私が探していたものです。 – Adelin

+0

2番目の提案では、夏時間や閏秒の変更は考慮されていません。 2つの日付がお互いに24時間以内にあるかどうかだけを教えてくれるでしょう。これは、24時間でミリ秒数を計算することでさらに簡単に行えます。それがあなたの望むものでなければ、あなたの既存のコードを読者にもっと明白にしてください。 – SimonC

+0

@ SimonC - 関連する「コード」は実際にはコメントです。夏時間を考慮するかどうかは、実装方法によって異なります。 (しかし、はい、これは事を複雑にします。)私はうるう秒が無関係であると確信しています。彼らは、UTCのベースライン時間を調整することによって動作します... –

0

日付のフォーマットは固定したままので、あなたは、これを試すことができます。

String first = date1.toString().substring(4,10) + " " + date.toString().substring(24, 28); 
    String second = date2.toString().substring(4,10) + " " + date.toString().substring(24, 28); 

が出力されます

1969年12月31日

1969年1月6日

そして結果を比較してください。

return (first.equals(second)); 

あなたの考えよりも優れているかどうかは分かりませんが、同じ結果が得られます。

+1

これは、日付が等しいかどうか比較する場合にのみ有効です。そして、それは本当に効率が悪いです...とNON-PORTABLEです。なぜなら、ifはロケール固有のデフォルトの文字列フォーマットに依存しているからです。 –

+0

答えがありがとうございますが、私は(date1.before(date2))のユーザーにはできません... :) – Adelin

8

実際にjava.util.Dateを使用する必要がありますか?正確に何が必要ありません

dateTime.dayOfMonth().roundFloorCopy() 

:あなたはjoda timeに切り替えることができた場合は、次のような非常に素晴らしい機能を見つけることができます。

+0

これは私が探していた答えの一種ですが、私のプロジェクトは小さく、私は必要ありませんより多くの依存関係を追加するには – Adelin

+0

Jodaは今日の主流のようなものなので、わかりにくいライブラリを使用することに心配する必要はありません...プロジェクトの規模は小さくても、ロギングを行うにはslf4jテストを書いているのならtestng、日付/時刻について心配しているのなら、Joda(またはその代替案、もちろんここでは宗教戦争を始めたくない)が必要です。 –

+0

あなたは正しいかもしれない将来私はジョーダを追加します – Adelin

関連する問題