如何检查两个日期之间的差异是否超过20分钟?

44

我有一个变量previous存储了一个日期时间。现在我想检查这个先前的日期时间是否比当前时间早二十分钟以上。

Date previous = myobj.getPreviousDate();

Date now = new Date();

//check if previous was before 20 minutes from now ie now-previous >=20

我们应该如何做?


这些函数返回什么形式的时间?Unix时间吗? - Kaiser Wilhelm
是的,请看这里:http://download.oracle.com/javase/6/docs/api/java/util/Date.html#getTime%28%29 - craesh
5个回答

77

使用

if (now.getTime() - previous.getTime() >= 20*60*1000) {
    ...
}

或者更冗长一些,但也许稍微容易阅读一些:

import static java.util.concurrent.TimeUnit.*;

...

long MAX_DURATION = MILLISECONDS.convert(20, MINUTES);

long duration = now.getTime() - previous.getTime();

if (duration >= MAX_DURATION) {
    ...
}

@all:如果现在时间减去之前的时间大于20601000,那不就是说我想要检查之前的时间是否比现在早20分钟以上吗? - Akshay
如果“现在减去之前”的时间大于20分钟,那么之前发生的事件就是在20分钟之前。 - aioobe
2
当两个时间重叠在夏令时切换点时,这种方法无法正常工作。 - Eric

22

使用Joda Time

boolean result = Minutes.minutesBetween(new DateTime(previous), new DateTime())
                        .isGreaterThan(Minutes.minutes(20));

7

Java 8 解决方案:

private static boolean isAtleastTwentyMinutesAgo(Date date) {
    Instant instant = Instant.ofEpochMilli(date.getTime());
    Instant twentyMinutesAgo = Instant.now().minus(Duration.ofMinutes(20));

    try {
        return instant.isBefore(twentyMinutesAgo);
    } catch (IOException e) {
        throw new IllegalStateException(e);
    }
}

也适用于Java 6和7,需要使用ThreeTen-Backport项目,在Android中需要使用ThreeTenABP项目。 - Basil Bourque

6
您应该使用日历对象而不是日期对象:
Calendar previous = Calendar.getInstance();
previous.setTime(myobj.getPreviousDate());
Calendar now = Calendar.getInstance();
long diff = now.getTimeInMillis() - previous.getTimeInMillis();
if(diff >= 20 * 60 * 1000)
{
    //at least 20 minutes difference
}

应该是 long diff = now.getTimeInMillis() - previous.getTimeInMillis(); - Milton
当两个时间重叠在夏令时切换点时,这种方法无法正常工作。 - Eric
忽略节能点,您需要使用协调世界时(UTC)时间。或者,如果应用程序运行的国家没有夏令时切换点(例如中国),那么您就很幸运了。 - Alexander Heim

1

获取毫秒级时间,并检查差异:

long diff = now.getTime() - previous.getTime();
if (diff > 20L * 60 * 1000) {
    // ...
}

另一个解决方案可能是使用Joda时间。


1
OP要求检查previuos是否在当前时间前20分钟,而不是它们之间的差异。 - Eng.Fouad
读得太快了。已经纠正 :) - Vivien Barousse
比较符号的使用方式相反。我想检查之前的时间是否比当前时间早20分钟以上。 - Akshay
@Akshay:比较符号没问题。减法方向错了(现已更正)。但是如果“previous”比“now”早20分钟,时间差将大于20分钟。 - Vivien Barousse

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