如何在java中比较两个日期和时间

时间:2014-02-26 11:29:43

标签: java datetime compare

我有两个 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进行比较。

由于

6 个答案:

答案 0 :(得分:32)

Date实施Comparable<Date>以来,它就像:

一样简单
date1.compareTo(date2);

Comparable合同规定的那样,如果date1被认为分别小于/大于date2,则它将返回负整数/零/正整数(即,在这种情况下之前/之后/之后)。

请注意,Date还有.after().before()方法,这些方法会返回布尔值。

答案 1 :(得分:5)

替代方案是......

将两个日期转换为毫秒,如下所示

Date d = new Date();
long l = d.getTime();

现在比较两个长值

答案 2 :(得分:3)

使用compareTo()

返回值

如果参数Date等于此Date,则

0;如果此Date在Date参数之前,则小于0的值;如果此Date在Date参数之后,则值大于0.

<强>像

if(date1.compareTo(date2)>0) 

答案 3 :(得分:3)

另一种选择是Joda-Time

使用DateTime

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

答案 4 :(得分: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!");
}

答案 5 :(得分:1)

其他答案通常是正确的,并且都已过时。在您的日期和时间工作中,请使用java.time(现代的Java日期和时间API)。与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是过去的

由于您的字符串无法告知我们任何时区或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,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在旧版Android上,请使用Android版的ThreeTen Backport。称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接