比较两个Calendar对象

Cha*_*ake 25 java theory calendar

我想比较两个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())));
}
Run Code Online (Sandbox Code Playgroud)

这种方法是正确的还是我应该逐场比较c1和c2?

Dro*_*gba 56

尝试 compareTo

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.compareTo(c2);
Run Code Online (Sandbox Code Playgroud)

退货:

如果参数表示的时间等于此Calendar表示的时间,则值为0; 如果此Calendar的时间早于参数表示的时间,则小于0的值; 如果此Calendar的时间在参数表示的时间之后,则值大于0.

编辑

import org.apache.commons.lang3.time.DateUtils;
Run Code Online (Sandbox Code Playgroud)

您可以使用DateUtils.isSameDay它来检查它是否在同一天.

boolean isSameDay = DateUtils.isSameDay(c1, c2);
Run Code Online (Sandbox Code Playgroud)

2002年3月28日13:45和2002年3月28日06:01将恢复正常.2002年3月28日13:45和2002年3月12日13:45将返回虚假.


Jon*_*eet 20

我已经实现了这一点,我无法考虑它应该失败的任何情况

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

如果两个日历代表不同的日历系统,它也可能会失败 - 即使它们代表相同的"日期",如果两个日历代表那一天不同,你可以说它应该失败.

就个人而言,我强烈建议你使用Joda Time,它有一种LocalDate类型来代表一个日期 - 这将摆脱时区问题,而不是日历系统问题.如果你总能假设你使用相同的日历系统,那就没关系.

(此外,仅仅为了比较目的而执行字符串操作很难看 - 我只是calendar.get(Calendar.YEAR)直接检查等.)


Ami*_*nde 10

你可以像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));
}
Run Code Online (Sandbox Code Playgroud)