2

嗨,我正在使用以下方法创建日历实例:

Calendar calendarDate=Calendar.getInstance();
            calendarDate.set(2012, 6, 1,0,0,0);
                Date date1=calendar.getTime();

之后,我使用以下方法创建 java.util.date 的实例:

Date date2=new Date(2012 - 1900,7-1, 01);

现在,当我尝试使用以下代码比较日期时:

System.out.println(date2.compareTo(date1));
System.out.println(date1.compareTo(date2));

它打印 -1 和 1 而不是 0(零)。
谁能帮我找出问题所在?

4

5 回答 5

5

尝试在设置新日历之前清除日历的值。这将解决您的问题。

Calendar calendarDate=Calendar.getInstance();
calendarDate.clear();
calendarDate.set(2012, 6, 1,0,0,0);

测试它:

import java.util.Calendar;
import java.util.Date;

import org.junit.Assert;

public class DateTest {

    @org.junit.Test
    public void test() {
        Calendar calendarDate=Calendar.getInstance();
        calendarDate.clear();
        calendarDate.set(2012, 6, 1,0,0,0);
        Assert.assertEquals(0, calendarDate.getTime().compareTo(new Date(2012 - 1900,7-1, 01)));
    }

}
于 2012-07-18T13:07:24.377 回答
2

日期和日历类是不同的。java.util.Date 的大多数方法都已弃用。因此最好使用 Calender 类。有关方法的更多信息,请查看以下网址。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html

于 2012-07-18T13:32:22.447 回答
1

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Date.html#compareTo(java.lang.Object )

相比于

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

于 2012-07-18T13:05:42.417 回答
0

日期为 GMT,除非使用不推荐使用的构造函数。这里会有区别,因为您还需要将毫秒设置为 0。

Calendar calendarDate=Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendarDate.set(2012, Calendar.JULY, 1,0,0,0);
calendarDate.set(Calendar.MILLISECOND, 0);
Date date1 = calendarDate.getTime();
Date date2=new Date(2012 - 1900,7-1, 1, 1, 0, 0);
System.out.println(date1);
System.out.println(date2);
System.out.println(date2.compareTo(date1));
System.out.println(date1.compareTo(date2));

印刷

Sun Jul 01 01:00:00 BST 2012
Sun Jul 01 01:00:00 BST 2012
0
0

注意:日历将保留您未设置的任何字段,因此第一个 set() 将保持毫秒不变。

于 2012-07-18T13:05:31.303 回答
0

date1 在哪里创建?您似乎认为 Calendar 和 Date 是相关的。他们不是。

于 2012-07-18T13:06:26.267 回答