30

我想比较两个日历对象,看看它们是否都包含相同的日期。我不在乎天以下的任何价值。

我已经实现了这一点,我想不出它应该失败的任何情况:

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

我已经实现了这个,我想不出它应该失败的任何情况

如果两个日历位于不同的时区,它将失败 - 它们可能代表完全相同的毫秒,但该时刻可能会根据时区落入不同的日子。

如果这两个日历代表不同的日历系统,它也可能会失败——即使它们代表同一个“日”,如果两个日历代表那一天的方式不同,你可能会争辩说它应该失败。

就个人而言,我强烈建议您使用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.set(int field, int value) 将低于该日期的所有字段设置为最小值(根据字段为 0 或 1),然后进行比较。要比较 cal1 和 cal2 之间的天数差异,您将在调用 cal1.compare(cal2) 之前将两个对象上的 MINUTE、SECOND 和 MILLISECOND 设置为 0。

于 2013-07-03T16:05:21.083 回答
1

日历类有一个方法 compareTo。为什么不直接调用呢?

于 2012-10-19T08:34:15.030 回答