2つのCalendarオブジェクトを比較して、両方に同じ日付が含まれているかどうかを確認します。私は数日以下の値を気にしません。
私はこれを実装しましたが、失敗するケースは考えられません:
private static boolean areEqualDays(Calendar c1, Calendar c2) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
return (sdf.format(c1.getTime()).equals(sdf.format(c2.getTime())));
}
このアプローチは正しいですか、またはフィールドごとにc1とc2を比較する必要がありますか?
これを実装しましたが、失敗するケースは考えられません
2つのカレンダーが異なるタイムゾーンにある場合は失敗します-それらは正確に同じミリ秒を表すことができますが、その瞬間はタイムゾーン。
また、2つのカレンダーが異なるカレンダーシステムを表す場合は間違いなく失敗します。同じ「日」を表す場合でも、2つのカレンダーがその日を異なる方法で表す場合、失敗するべきだと主張できます。
個人的には、強く使用することをお勧めします Joda Time これは、日付だけを表すLocalDate
タイプを持ちます-それはタイムゾーンの問題を取り除きますが、notカレンダーシステムの問題ではありません。常に同じカレンダーシステムを使用していると想定できる場合は、問題ありません。
(さらに、比較のためだけに文字列操作を実行するのはいです-私はcalendar.get(Calendar.YEAR)
などを直接チェックしたいだけです。)
試行compareTo
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.compareTo(c2);
戻り値:
引数で表される時間がこのCalendarで表される時間と等しい場合、値0。このCalendarの時間が引数で表される時間より前の場合、0より小さい値。このCalendarの時刻が引数で表される時刻より後の場合、0より大きい値。
[〜#〜] edit [〜#〜]
import org.Apache.commons.lang3.time.DateUtils;
DateUtils.isSameDay
を使用して、同日かどうかを確認できます。
boolean isSameDay = DateUtils.isSameDay(c1, c2);
2002年3月28日13:45および2002年3月28日06:01はtrueを返します。 2002年3月28日13:45および2002年3月12日13:45はfalseを返します。
DateUtils のようなsomehingを使用できます
public boolean isSameDay(Calendar cal1, Calendar cal2) {
if (cal1 == null || cal2 == null)
return false;
return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA)
&& cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)
&& cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));
}
特定のフィールドに関して2つの日付を比較するには、最初にCalendar.set(int field、int value)を使用して、その下のすべてのフィールドを最小値(フィールドに応じて0または1)に設定してから比較します。 cal1とcal2の日数の違いを比較するには、cal1.compare(cal2)を呼び出す前に、両方のオブジェクトのMINUTE、SECOND、およびMILLISECONDを0に設定します。
カレンダークラスにはメソッドcompareToがあります。なぜあなたは直接それを呼ばないのですか?