比较Java中的两个日期

Gna*_*air 25 java compare date

我需要比较java中的两个日期.我正在使用这样的代码:

Date questionDate = question.getStartDate();
Date today = new Date();

if(today.equals(questionDate)){
    System.out.println("Both are equals");
}
Run Code Online (Sandbox Code Playgroud)

这不起作用.变量的内容如下:

  • questionDate 包含 2010-06-30 00:31:40.0
  • today 包含 Wed Jun 30 01:41:25 IST 2010

我该如何解决这个问题?

Eri*_*ser 42

日期相等性取决于两个日期等于毫秒.使用创建新的Date对象new Date()永远不会等于过去创建的日期.Joda Time的API简化了日期工作; 但是,仅使用Java的SDK:

if (removeTime(questionDate).equals(removeTime(today)) 
  ...

public Date removeTime(Date date) {    
    Calendar cal = Calendar.getInstance();  
    cal.setTime(date);  
    cal.set(Calendar.HOUR_OF_DAY, 0);  
    cal.set(Calendar.MINUTE, 0);  
    cal.set(Calendar.SECOND, 0);  
    cal.set(Calendar.MILLISECOND, 0);  
    return cal.getTime(); 
}
Run Code Online (Sandbox Code Playgroud)


Coo*_*ans 13

我会用JodaTime来做这件事.这是一个例子 - 假设您想要找到两个日期之间的天数差异.

DateTime startDate = new DateTime(some_date); 
DateTime endDate = new DateTime(); //current date
Days diff = Days.daysBetween(startDate, endDate);
System.out.println(diff.getDays());
Run Code Online (Sandbox Code Playgroud)

JodaTime可以从这里下载.


Gre*_*att 10

我不清楚你想要什么,但我会提到Date类还有一个compareTo方法,如果两个Date对象相等或者(如果它们不相等),可以用一个调用来确定更早.这允许您执行以下操作:

switch (today.compareTo(questionDate)) {
    case -1:  System.out.println("today is sooner than questionDate");  break;
    case 0:   System.out.println("today and questionDate are equal");  break;
    case 1:   System.out.println("today is later than questionDate");  break;
    default:  System.out.println("Invalid results from date comparison"); break;
}
Run Code Online (Sandbox Code Playgroud)

应该注意的是,API文档不保证结果为-1,0和1,因此您可能希望在任何生产代码中使用if-elses而不是switch.此外,如果第二个日期为null,您将获得NullPointerException,因此将代码包装在try-catch中可能很有用.


小智 5

比较两个日期的最简单方法是将它们转换为数值(如unix时间戳).

您可以使用Date.getTime()返回unix时间的方法.

Date questionDate = question.getStartDate();
Date today = new Date();
if((today.getTime() == questionDate.getTime())) {
    System.out.println("Both are equals");
}
Run Code Online (Sandbox Code Playgroud)


rec*_*e96 5

时间

在 Java 8 中不需要使用Joda-Time,因为它在java.time包中带有类似的新 API 。使用LocalDate类。

LocalDate date = LocalDate.of(2014, 3, 18);
LocalDate today = LocalDate.now();

Boolean isToday = date.isEqual( today );
Run Code Online (Sandbox Code Playgroud)

您可以询问Period上课日期之间的时间跨度。

Period difference = Period.between(date, today);
Run Code Online (Sandbox Code Playgroud)

LocalDate可以比较使用equals并且compareTo因为它没有关于时间和时区的信息。


关于 java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多