比较Java中的两个日期

时间:2010-06-29 20:15:22

标签: java compare date

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

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

if(today.equals(questionDate)){
    System.out.println("Both are equals");
}

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

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

我该如何解决这个问题?

14 个答案:

答案 0 :(得分:42)

日期相等性取决于两个日期等于毫秒。使用new Date()创建新的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(); 
}

答案 1 :(得分: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());

JodaTime可以从here下载。

答案 2 :(得分: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;
}

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

答案 3 :(得分:5)

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

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

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

答案 4 :(得分:3)

使用time.compareTo(currentTime) < 0

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask {
    static Timer singleTask = new Timer();

    @SuppressWarnings("deprecation")
    public static void main(String args[]) {
        // set download schedule time
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 9);
        calendar.set(Calendar.MINUTE, 54);
        calendar.set(Calendar.SECOND, 0);
        Date time = (Date) calendar.getTime();
        // get current time
        Date currentTime = new Date();
        // if current time> time schedule set for next day
        if (time.compareTo(currentTime) < 0) {

            time.setDate(time.getDate() + 1);
        } else {
            // do nothing
        }
        singleTask.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("timer task is runing");
            }
        }, time);

    }

}

答案 5 :(得分:3)

java.time

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

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

Boolean isToday = date.isEqual( today );

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

Period difference = Period.between(date, today);
使用equalscompareTo

LocalDate具有可比性,因为它不包含有关时间和时区的信息。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 6 :(得分:1)

如果两个Calendar变量在一年中的同一天,则以下内容将返回true。

  public boolean isSameDay(Calendar c1, Calendar c2){
    final int DAY=1000*60*60*24;
    return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY));
  } // end isSameDay

答案 7 :(得分:0)

这是另一个答案: 您需要格式化拖曳日期以适合相同的fromat,以便能够将它们作为字符串进行比较。

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

    SimpleDateFormat dateFormatter = new SimpleDateFormat ("yyyy/MM/dd");

    String questionDateStr = dateFormatter.format(questionDate);
    String todayStr = dateFormatter.format(today);

    if(questionDateStr.equals(todayStr)) {
        System.out.println("Both are equals");
    }

答案 8 :(得分:0)

public static double periodOfTimeInMillis(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime());
}

public static double periodOfTimeInSec(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / 1000;
}

public static double periodOfTimeInMin(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / (60 * 1000);
}

public static double periodOfTimeInHours(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / (60 * 60 * 1000);
}

public static double periodOfTimeInDays(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000L);
}

答案 9 :(得分:0)

public long compareDates(Date exp, Date today){

        long b = (exp.getTime()-86400000)/86400000;
        long c = (today.getTime()-86400000)/86400000;
        return b-c;
    }

这适用于GregorianDates. 86400000是一天中的毫秒数,这将返回两个日期之间的天数。

答案 10 :(得分:0)

这是一篇非常古老的帖子,虽然分享我的作品。这是一个小技巧

DateTime dtStart = new DateTime(Dateforcomparision); 
DateTime dtNow = new DateTime(); //current date

if(dtStart.getMillis() <= dtNow.getMillis())
{
   //to do
}

根据您的要求使用比较器

答案 11 :(得分:0)

在我的情况下,我只需做这样的事情:

{{1}}

它有效!

答案 12 :(得分:0)

效果最佳....

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();

cal1.setTime(date1);
cal2.setTime(date2);

boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);

答案 13 :(得分:-1)

以下是你可以做的yyyy-mm-dd比较:

GregorianCalendar gc= new GregorianCalendar();
gc.setTimeInMillis(System.currentTimeMillis());
gc.roll(GregorianCalendar.DAY_OF_MONTH, true);

Date d1 = new Date();
Date d2 = gc.getTime();

SimpleDateFormat sf= new SimpleDateFormat("yyyy-MM-dd");

if(sf.format(d2).hashCode() < sf.format(d1).hashCode())
{
    System.out.println("date 2 is less than date 1");
}
else
{
    System.out.println("date 2 is equal or greater than date 1");
}