比较两个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()))); } 

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

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

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

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

就个人而言,我强烈建议您使用具有LocalDate类型的Joda Time来表示日期 – 这将消除时区问题,而不是日历系统问题。 如果你总能假设你使用相同的日历系统,那就没关系。

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

试试 compareTo

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

退货

如果参数表示的时间等于此Calendar表示的时间,则值为0; 如果此Calendar的时间早于参数表示的时间,则小于0的值; 如果此Calendar的时间在参数表示的时间之后,则值大于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将恢复正常。 2002年3月28日13:45和2002年3月12日13:45将返回假。

你可以像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)); } 

Calendar类有一个方法compareTo。 你为什么不直接打电话呢?

要比较特定字段的两个日期,首先使用Calendar.set(int字段,int值)将该字段下面的所有字段设置为最低值(取决于字段为0或1),然后进行比较。 要比较cal1和cal2之间的天数差异,在调用cal1.compare(cal2)之前,将两个对象上的MINUTE,SECOND和MILLISECOND设置为0。