如何在Java中比较带时间的两个日期

24

我有两个格式如下的Date对象。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
String matchDateTime = sdf.parse("2014-01-16T10:25:00");
Date matchDateTime = null;

try {
    matchDateTime = sdf.parse(newMatchDateTimeString);
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

// get the current date
Date currenthDateTime = null;
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date dt = new Date();
String currentDateTimeString = dateFormat.format(dt);
Log.v("CCCCCurrent DDDate String is:", "" + currentDateTimeString);

try {                   
    currenthDateTime = sdf.parse(currentDateTimeString);
} catch (ParseException e) {
    // TODO Auto-generated catch block 
    e.printStackTrace();
}

现在我想比较上述两个日期和时间。在Java中应该如何比较。 谢谢。

可能是如何在Java中比较日期?的重复问题。 - Basil Bourque
6个回答

43

由于Date实现了Comparable<Date>,因此只需要这样简单的做:

date1.compareTo(date2);
根据Comparable接口的规定,如果date1被认为小于/等于/大于date2,则它会返回一个负整数/零/正整数(在这种情况下分别表示在date2之前/相同/之后)。
请注意,Date类还有.after().before()方法,这些方法将返回布尔值。

我能否通过使用compareTo方法来获取类似于2天或16小时之类的持续时间? - praxmon
@PrakharMohanSrivastava 不行,你必须要对毫秒进行差异比较。之后你可以使用 TimeUnit 来帮助你“分数化”结果的差异。 - fge

9
一个替代方案是....
将两个日期都转换为毫秒数,如下所示:
Date d = new Date();
long l = d.getTime();

现在比较这两个长整型数值。

6

使用compareTo()

返回值

如果参数日期与此日期相等,则返回0;如果此日期在日期参数之前,则返回小于0的值;如果此日期在日期参数之后,则返回大于0的值。

例如

if(date1.compareTo(date2)>0) 

3

另一个选择是Joda-Time

使用DateTime。

DateTime date = new DateTime(new Date());
date.isBeforeNow();
or
date.isAfterNow();

这也适用于Java 8。 - Sebastian D'Agostino

2
 // Get calendar set to the current date and time
Calendar cal = Calendar.getInstance();

// Set time of calendar to 18:00
cal.set(Calendar.HOUR_OF_DAY, 18);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

// Check if current time is after 18:00 today
boolean afterSix = Calendar.getInstance().after(cal);

if (afterSix) {
    System.out.println("Go home, it's after 6 PM!");
}
else {
    System.out.println("Hello!");
}

2

其他答案大体正确,但都已过时。在处理日期和时间方面,请使用现代的Java日期和时间API - java.time。相较于2014年2月提出该问题时的情况,使用java.time可以让你的工作变得更加容易。

    String dateTimeString = "2014-01-16T10:25:00";
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString);
    LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());

    if (dateTime.isBefore(now)) {
        System.out.println(dateTimeString + " is in the past");
    } else if (dateTime.isAfter(now)) {
        System.out.println(dateTimeString + " is in the future");
    } else {
        System.out.println(dateTimeString + " is now");
    }

当在2020年运行此代码段时,输出如下:
``` 2014-01-16T10:25:00 is in the past ```
由于您的字符串没有提供任何时区或UTC偏移量的信息,我们需要知道被理解的内容。上面的代码使用设备的时区设置。对于已知的时区,请使用像ZoneId.of("Asia/Ulaanbaatar")这样的用法。对于UTC,请指定ZoneOffset.UTC
我正在利用您的字符串采用ISO 8601格式的事实。java.time类解析最常见的ISO 8601变体,而无需给出任何格式化程序。
问题:对于Android开发,java.time是否需要Android API级别26?
java.time在旧版和新版Android设备上都可以很好地工作。它只需要至少Java 6
  • 在Java 8及更高版本以及较新的Android设备(从API级别26)中,现代API已内置。
  • 在非Android Java 6和7中,使用ThreeTen Backport,即现代类的后备(JSR 310的ThreeTen;请参见底部链接)。
  • 在(较旧的)Android上使用ThreeTen Backport的Android版本。它称为ThreeTenABP。并确保从org.threeten.bp导入日期和时间类及其子包。
链接

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