我想有一个compareTo方法来忽略java.util.Date的时间部分。我想有很多方法可以解决这个问题。最简单的方法是什么?


当前回答

已经提到了apache common -utils:

org.apache.commons.lang.time.DateUtils.truncate(date, Calendar.DAY_OF_MONTH)

给你Date对象,只包含日期,没有时间,你可以与Date. compareto进行比较

其他回答

public Date saveDateWithoutTime(Date date) {
    Calendar calendar = Calendar.getInstance();

    calendar.setTime( date );
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.HOUR, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    return calendar.getTime();
}

这将帮助你在不考虑时间的情况下比较日期。

    Date today = new Date();
    Date endDate = new Date();//this
    endDate.setTime(endDate.getTime() - ((endDate.getHours()*60*60*1000) + (endDate.getMinutes()*60*1000) + (endDate.getSeconds()*1000)));
    today.setTime(today.getTime() - ((today.getHours()*60*60*1000) + (today.getMinutes()*60*1000) + (today.getSeconds()*1000)));

    System.out.println(endDate.compareTo(today) <= 0);

我只是将小时/分/秒设置为0,所以时间没有问题,因为现在两个日期的时间都是相同的。现在只需使用compareTo。这个方法帮助找到“if dueDate is today”,其中true表示Yes。

恐怕没有一种方法可以比较两个日期,可以称之为“容易”或“简单”。

当比较两个精度降低的时间实例时(例如,只是比较日期),你必须考虑时区对比较的影响。

例如,如果date1指定发生在+2时区的事件,而date2指定发生在EST时区的事件,则必须注意正确理解比较的含义。

你的目的是要弄清楚这两件事是否发生在各自时区的同一日历日期?或者,您是否需要知道这两个日期是否属于特定时区(例如,UTC或您的本地TZ)中的相同日历日期。

一旦你弄清楚你想要比较的是什么,就只需要在适当的时区获得年-月-日三元组合并进行比较。

Joda时间可能使实际的比较操作看起来更简洁,但是比较的语义仍然需要您自己弄清楚。

我也更喜欢Joda Time,但这里有一个替代方案:

long oneDay = 24 * 60 * 60 * 1000
long d1 = first.getTime() / oneDay
long d2 = second.getTime() / oneDay
d1 == d2

EDIT

我把UTC的东西放在下面,以防你需要比较UTC以外的特定时区的日期。如果你确实有这样的需求,那么我真的建议你去找Joda。

long oneDay = 24 * 60 * 60 * 1000
long hoursFromUTC = -4 * 60 * 60 * 1000 // EST with Daylight Time Savings
long d1 = (first.getTime() + hoursFromUTC) / oneDay
long d2 = (second.getTime() + hoursFromUTC) / oneDay
d1 == d2

对这个替代方案有什么意见吗?

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));