Java日历问题:为什么这两个日期不相等?

时间:2010-10-28 12:18:16

标签: java

import java.io.*;

public class testing {
    public static void main(String a[]) throws Exception{
        Date d1=new Date();
        Thread.sleep(2000);
        Date d2=new Date();
        if(d1.equals(d2)){
            System.out.println("Both equal");
        }else{
            System.out.println("Both not equal");
        }
        Calendar c1=Calendar.getInstance();
        Calendar c2=Calendar.getInstance();
        c1.setTime(d1);
        c2.setTime(d2);
        c1.clear(Calendar.HOUR);
        c1.clear(Calendar.MINUTE);
        c1.clear(Calendar.SECOND);
        c2.clear(Calendar.HOUR);
        c2.clear(Calendar.MINUTE);
        c2.clear(Calendar.SECOND);
        if(c2.compareTo(c1) == 0){
            System.out.println("Cal Equal");
        }else {
            System.out.println("Cal Not Equal");
        }
    }
}

当我每次多次运行上述代码时(如果条件为日期打印)“两个不相等”打印但是(对于日历的条件)有时打印“Cal Equal”,有时“Cal Not”等于'。有人可以解释一下为什么会这样吗?

我尝试这个的主要原因是因为我想比较两个日期。两者都具有相同的日,月和年,但是创建对象的时间不同。我希望它们相等(相同)。我该怎么做?

6 个答案:

答案 0 :(得分:21)

截断毫秒字段

日历也有毫秒。加上这个:

c1.clear(Calendar.MILLISECOND);
c2.clear(Calendar.MILLISECOND);

但使用DateUtils.truncate()

中的Apache Commons / Lang更容易实现该功能
c1 = DateUtils.truncate(c1, Calendar.DATE);
c2 = DateUtils.truncate(c2, Calendar.DATE);

这将删除所有小时,分钟,秒和毫秒。

答案 1 :(得分:3)

我相信日历也具有毫秒精度。如果您想继续使用代码,请添加

c1.clear(Calendar.MILLISECOND);
c2.clear(Calendar.MILLISECOND);

然后尝试比较。

答案 2 :(得分:2)

使用JodaTime代替它,它比标准日期和日历更好(操作日期和时间)。

答案 3 :(得分:1)

您需要清除毫秒

答案 4 :(得分:1)

之后

Calendar c1=Calendar.getInstance();

添加

c1.clear();

输入比c1.clear(Calendar.MILLISECOND);

更容易

努力享受。

答案 5 :(得分:0)

使用以下方法删除时间以比较日期

private Calendar resetHours(Calendar cal) {
        cal.set(Calendar.HOUR, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND,0);
        cal.set(Calendar.HOUR_OF_DAY,0);
        cal.set(Calendar.MILLISECOND,0);
        return cal;
    }