web-dev-qa-db-ja.com

2つのCalendarオブジェクトの比較

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を比較する必要がありますか?

21
Charlie-Blake

これを実装しましたが、失敗するケースは考えられません

2つのカレンダーが異なるタイムゾーンにある場合は失敗します-それらは正確に同じミリ秒を表すことができますが、その瞬間はタイムゾーン。

また、2つのカレンダーが異なるカレンダーシステムを表す場合は間違いなく失敗します。同じ「日」を表す場合でも、2つのカレンダーがその日を異なる方法で表す場合、失敗するべきだと主張できます。

個人的には、強く使用することをお勧めします Joda Time これは、日付だけを表すLocalDateタイプを持ちます-それはタイムゾーンの問題を取り除きますが、notカレンダーシステムの問題ではありません。常に同じカレンダーシステムを使用していると想定できる場合は、問題ありません。

(さらに、比較のためだけに文字列操作を実行するのはいです-私はcalendar.get(Calendar.YEAR)などを直接チェックしたいだけです。)

18
Jon Skeet

試行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を返します。

52
Drogba

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));
}
9
Amit Deshpande

特定のフィールドに関して2つの日付を比較するには、最初にCalendar.set(int field、int value)を使用して、その下のすべてのフィールドを最小値(フィールドに応じて0または1)に設定してから比較します。 cal1とcal2の日数の違いを比較するには、cal1.compare(cal2)を呼び出す前に、両方のオブジェクトのMINUTE、SECOND、およびMILLISECONDを0に設定します。

1
Andreas

カレンダークラスにはメソッドcompareToがあります。なぜあなたは直接それを呼ばないのですか?

1
Sumit Desai