首先问问Calendar类可不可以比较,如果可以,请看下面代码:import java.util.*;public class Test{
public static void main(String[] args){
Calendar a=Calendar.getInstance();
Calendar b=Calendar.getInstance();
a.set(1999,3,1,0,0,0);
b.set(1999,3,1,0,0,0);
System.out.println(a.compareTo(b));
}}上面的代码运行结果应该是0,但是发觉有时是0,有时是-1(虽然很少,但
运行多次后就会出现了),无语中

解决方案 »

  1.   

    这个和Calendar内部数据有关。它里面的数据是一个浮点值,是时间最小单位的值。
    所以你a和b在用getInstance()得到的时候,默认是当时的时间,而cpu很快,但这两个语句之间可能还是有一个单位(即时间最小单位)的差;也就是说两个语句之间用了一个单位时间才完成。
    好,下面你把a和b的年、月、日、小时、分、秒都设了,但是不是最小的千分之几秒还没有设置呢?
    所以就有了有时是0,有时是-1(绝对不会出现正1吧,因为永远都是按顺序运行的语句)。
      

  2.   

    为了证明我分析的正确性,我写了个程序,很能说明问题。
    public static void main(String[] args) {
    // TODO Auto-generated method stub
        Calendar a=Calendar.getInstance();
        Calendar b=Calendar.getInstance();
        System.out.println("before setting: ");
        System.out.println("a is: " + a.getTimeInMillis());
        System.out.println("b is: " + b.getTimeInMillis());
        a.set(1999,3,1,0,0,0);
        b.set(1999,3,1,0,0,0);
        System.out.println("after setting: ");
        System.out.println("a is now: " + a.getTimeInMillis());
        System.out.println("b is now: " + b.getTimeInMillis());
        System.out.println(a.compareTo(b)); }
    然后输出是:
    before setting: 
    a is: 1206885731437
    b is: 1206885731437
    after setting: 
    a is now: 922924800437
    b is now: 922924800437
    0好了,最能说明问题的是看下a和b被设置后,最后3位数都没有改变过,为437,说明设置没有到最小单位。
      

  3.   

    你们想要“解决”办法,不过我要问下,要解决什么“问题”?这里根本就没有问题啊。把Calender当成真的日期这个东东来看,楼主想要干什么?只是想让两个“日期”一样。
    那么既然Calender里面的值是有最小单位的,那么直接用最小单位把日期设成一样就行了嘛。但是这个问题这样处理一点也没有通用之处,日期不一样,就要设成一样,如果日期没有让你直接设最小单元的东西,只有年月日分时秒让你来设,不是要累死?
    再想一下,如果另一个东东,你想要设成一样的,那又得把“类似”的代码来一次,把所有属性重新写一次,而且不能写错,天啊,不是要命么?但是既然java是一个OO语言,这就好搞了,楼主要做的事,要解决的问题无非是要一个和原来一样的一个“日期”而已,一个东东要它的副本,怎么办?
    object,这个java的基类已经给楼主准备好了一个叫clone()的接口了,直接用之即可。以原来的例子上加行代码,给出一个叫C的日期,让它和a一样,而且一个属性不用设:
        Calendar a=Calendar.getInstance();
        Calendar b=Calendar.getInstance();
        System.out.println("before setting: ");
        System.out.println("a is: " + a.getTimeInMillis());
        System.out.println("b is: " + b.getTimeInMillis());
        a.set(1999,3,1,0,0,0);
        b.set(1999,3,1,0,0,0);
        System.out.println("after setting: ");
        System.out.println("a is now: " + a.getTimeInMillis());
        System.out.println("b is now: " + b.getTimeInMillis());
        System.out.println(a.compareTo(b));
        
        Calendar c = (Calendar) a.clone();
        System.out.println("C is:" + c.getTimeInMillis());
    看下结果,是不是这样。
      

  4.   

    D:\>java Test
    before setting:
    a is: 1206886864125
    b is: 1206886864140
    after setting:
    a is now: 922896000125
    b is now: 922896000140
    -1果然
      

  5.   

    因为set方法所设置的最小单位是second 
    而Calendar对象可表示的却是millisecond
    这样这个值很可能就是由创建对象时的时刻所决定的想要避免这种情况,事先清数据
    calendar.clear();