如何在Java日期中仅比较日期?

4

我正在尝试对昨天和今天进行简单的日期比较

if (yesterday.before(today)) {
 ...
}

问题在于使用 before 方法时,即使只相差几秒钟,也会返回 true。如何仅比较日期(因为我只想在前一天为真时才评估此条件(应忽略分钟/秒)?
提前感谢您。

比较Java中的 java.util.Date 或 java.util.Calendar 中的日期。 - mKorbel
3
使用标准API似乎没有简单的方法来做到这一点,这让我很惊讶。如果由于某些原因不能使用commons lang(如Lobo所述),建议将每个日期转换为自纪元以来的天数(即millisSinceEpoch / MILLIS_IN_DAY)。 - OpenSauce
4个回答

12

使用DateUtils -

if (!DateUtils.isSameDay(yesterday, today) && (yesterday.before(today)) {
   //...
}

编辑:也可以不使用DateUtils来实现。请参见线程。


太棒了!这个repo的构件ID是什么,这样我就可以使用mvn添加它了? - Toran Billups
@Toran Billups - 我不确定,但是在 Google 搜索中找到了 <artifactId>commons-lang</artifactId>。我从未使用过 Maven。 - Praveen Lobo
1
对于其他人来说,这个链接帮助我将commons-lang添加到Maven中:http://mvnrepository.com/artifact/commons-lang/commons-lang/2.3 - Toran Billups

5

如果你不想使用第三方库,可以实现一个像这样的方法:

public boolean before(Calendar yesterday, Calendar today) {
    if(yesterday == today) return false;
    if(yesterday == null || today == null) return false;
    return  yesterday.get(Calendar.YEAR) < today.get(Calendar.YEAR) ? true : 
        yesterday.get(Calendar.YEAR) == today.get(Calendar.YEAR) && yesterday.get(Calendar.DAY_OF_YEAR) < today.get(Calendar.DAY_OF_YEAR);
}

4
如果你想添加一个处理日期比标准Java库更好的库,你可能需要看一下Joda
使用Joda,你可以计算天数差异:
  Days d = Days.daysBetween(startDate, endDate);
  int days = d.getDays();

其中startDateendDate是日期的Joda版本,实际上是DateTime的超类。

将Java Date对象转换为Joda DateTime对象可以通过构造函数调用完成:

DateTime dateTime = new DateTime(javaDate);

加入这个库可能对于这个特定问题来说有点过度,但如果你经常处理日期和时间操作,那么这个库绝对是值得的。

3

如果你想坚持使用Date,你可以暂时将当前日期向前调整一天。如果before()仍然导致相同的结果,则表示时间跨度至少为一天。

final static long DAY_MILLIS = 86400000;

Date d1 = new Date(2011, 06, 18);
Date d2 = new Date(2011, 06, 16);

Date temp = new Date(d1.getTime() - DAY_MILLIS);

if (temp.before(d2)) 
  // Do stuff
}

请注意,我使用了一个已弃用的构造函数,但它应该能完成工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接