30

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をフィールドごとに比較する必要がありますか?

4

6 に答える 6

62

試す compareTo

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.compareTo(c2);

戻り値

引数で表される時間がこのカレンダーで表される時間と等しい場合は、値0。このカレンダーの時刻が引数で表される時刻より前の場合は、0未満の値。このカレンダーの時刻が引数で表される時刻より後の場合は、0より大きい値。

編集

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

于 2012-10-19T08:36:41.583 に答える
22

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

2つのカレンダーが異なるタイムゾーンにある場合は失敗します。まったく同じミリ秒を表す可能性がありますが、その瞬間はタイムゾーンに基づいて異なる日に分類される可能性があります。

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

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

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

于 2012-10-19T08:39:24.340 に答える
13

DateUtilsのようなものを使用できます

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));
}

が同じ日時であるかどうかを確認することもできます。

public boolean isSameDateTime(Calendar cal1, Calendar cal2) {
    // compare if is the same ERA, YEAR, DAY, HOUR, MINUTE and SECOND
    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)
           && cal1.get(Calendar.HOUR_OF_DAY) == cal2.get(Calendar.HOUR_OF_DAY)
           && cal1.get(Calendar.MINUTE) == cal2.get(Calendar.MINUTE)
           && cal1.get(Calendar.SECOND) == cal2.get(Calendar.SECOND));
}
于 2012-10-19T08:41:33.983 に答える
2
于 2019-10-27T22:43:24.610 に答える
1

CalendarクラスにはcompareToメソッドがあります。直接呼んでみませんか?

于 2012-10-19T08:34:15.030 に答える
1

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

于 2013-07-03T16:05:21.083 に答える