如何比较两个没有时间部分的日期?

2022-08-31 05:50:04

我希望有一个比较To方法,它忽略了java.util.Date的时间部分。我想有很多方法可以解决这个问题。最简单的方法是什么?


答案 1

更新:虽然Joda Time在当时是一个很好的建议,但尽可能使用Java 8+的java.time库。


我更喜欢使用Joda Time,这使得这变得非常容易:

DateTime first = ...;
DateTime second = ...;

LocalDate firstDate = first.toLocalDate();
LocalDate secondDate = second.toLocalDate();

return firstDate.compareTo(secondDate);

编辑:正如评论中所指出的,如果你使用DateTimeComparator.getDateOnlyInstance(),它甚至更简单:)

// TODO: consider extracting the comparator to a field.
return DateTimeComparator.getDateOnlyInstance().compare(first, second);

(“使用Joda时间”是几乎所有询问或的SO问题的基础。这是一个完全优越的API。如果你正在做任何重要的日期/时间,你应该真正使用它,如果可能的话。java.util.Datejava.util.Calendar

如果您绝对被迫使用内置 API,则应创建一个具有适当日期并使用适当时区的 实例。然后,您可以将每个日历中的每个字段从小时、分钟、秒和毫秒设置为 0,并比较结果时间。与Joda解决方案相比,绝对很恶心,虽然:)Calendar

时区部分很重要:始终基于 UTC。在大多数情况下,我对某个日期感兴趣,那就是特定时区的日期。这本身会迫使你使用或Joda Time(除非你想自己考虑时区,我不建议这样做。java.util.DateCalendar

安卓开发者快速参考

//Add joda library dependency to your build.gradle file
dependencies {
     ...
     implementation 'joda-time:joda-time:2.9.9'
}

示例代码(示例)

DateTimeComparator dateTimeComparator = DateTimeComparator.getDateOnlyInstance();

Date myDateOne = ...;
Date myDateTwo = ...;

int retVal = dateTimeComparator.compare(myDateOne, myDateTwo);

if(retVal == 0)
   //both dates are equal
else if(retVal < 0)
   //myDateOne is before myDateTwo
else if(retVal > 0)
   //myDateOne is after myDateTwo

答案 2

Apache commons-lang几乎无处不在。那么这个呢?

if (DateUtils.isSameDay(date1, date2)) {
    // it's same
} else if (date1.before(date2)) {
   // it's before
} else {
   // it's after
}