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

新手上路,请多包涵

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

原文由 Arne Evertsson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 497
2 个回答

更新:虽然 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 Time”是几乎所有关于 java.util.Datejava.util.Calendar 的 SO 问题的基础。它是一个非常出色的 API。如果您正在对日期/时间做 任何 重要的事情,如果可能的话,你应该真正使用它。)

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

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

安卓开发者快速参考

//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

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

原文由 André 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题