首先问问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(虽然很少,但
运行多次后就会出现了),无语中
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(虽然很少,但
运行多次后就会出现了),无语中
解决方案 »
- 无法打开 U盘时,点击时, 报函数不正确,windows无法格式化???
- 帮忙解释下,基于Junit的Java自动单元测试系统如何着手做啊?
- java如何获得网络的剩余带宽呀?
- 哪位同学用过jsmooth把java的编译过的类文件制作成可执行exe程序??
- 请教算法!4个数组的比较问题?
- 关于导入到 Java3D 的文件格式
- 小女一问
- 请问java里面有没有类似C里面memcopy()一样的函数........................
- java中cancel按钮怎么做?
- IBM Visual Jave 3的帮助系统是怎么启动起来的?
- 急!在线等,关于mysql中sql语句的问题!
- 郁闷一下午的问题,请高手解决一下......................................................^_^
所以你a和b在用getInstance()得到的时候,默认是当时的时间,而cpu很快,但这两个语句之间可能还是有一个单位(即时间最小单位)的差;也就是说两个语句之间用了一个单位时间才完成。
好,下面你把a和b的年、月、日、小时、分、秒都设了,但是不是最小的千分之几秒还没有设置呢?
所以就有了有时是0,有时是-1(绝对不会出现正1吧,因为永远都是按顺序运行的语句)。
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,说明设置没有到最小单位。
那么既然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());
看下结果,是不是这样。
before setting:
a is: 1206886864125
b is: 1206886864140
after setting:
a is now: 922896000125
b is now: 922896000140
-1果然
而Calendar对象可表示的却是millisecond
这样这个值很可能就是由创建对象时的时刻所决定的想要避免这种情况,事先清数据
calendar.clear();