public int dis(String time1,String time2){//time1晚于time2
int i=-1;
long sec1,sec2;
Calendar time1c=Calendar.getInstance();
Calendar time2c=Calendar.getInstance();
time1c.set(Integer.parseInt(time1.substring(0, 4)),Integer.parseInt(time1.substring(5, 7))-1,
Integer.parseInt(time1.substring(8, 10)));
time2c.set(Integer.parseInt(time2.substring(0, 4)),Integer.parseInt(time2.substring(5, 7))-1,
Integer.parseInt(time2.substring(8,10)));
sec1=time1c.getTimeInMillis();
sec2=time2c.getTimeInMillis();
i=Integer.parseInt(Long.toString(sec1-sec2)/1000/60/60/24);
return i;
}
以上是常用方法,但是用这种方法计算time1晚于time2几天,会有约万分之一的概率得到比实际值小1的结果。因为time1c初始化语句在time2c初始化语句之前,虽然大多数情况下两条语句是在同一毫秒内执行的,但也有一定概率不是在同一毫秒执行。而Calendar类型初始化后其值是初始化时的时间,且精确到毫秒,虽然年月日时分秒都可用set方法改变,但毫秒数却是不能设置的。最后算出来的相差毫秒数比正确值小,然后再经过步步整除,会放大误差,比如除成秒会比正确值少一秒(前提是两条语句的执行时间相差不超过1秒),再除成分钟会少一分钟,依次类推,最终比正确值少一天。
解决这个问题的方法一是先初始化较早的时间即time2,后初始化time1,这样得出的相差毫秒数也会相对正确值有误差,但却是比正确值大,这样经过整除后反而会消除误差,这样得到的结果就是正确的了。
另一个方法是先分别将time1c和time2c的毫秒数/1000/60/60/24得到天数再相减。为什么这样是对的呢?因为Calendar类的getTimeInMillis()方法取的是该Calendar对象相对于1970年1月1日0时0分0秒0毫秒(UTC时间)的毫秒数,假设time1c是y年m月d日h时mm分s秒ms毫秒,显然它与1970年1月1日0时0分0秒0毫秒相差dis天零h时mm分s秒ms毫秒,而h时mm分s秒ms毫秒会在步步整除中从后向前依次被舍去,最后得到天数dis,显然也是准确的。
PS:还有另一种方法:
Calendar time1c=Calendar.getInstance();
Calendar time2c=Calendar.getInstance();
time2c.setTime(time1c.getTime());
即初始化后将两个Calendar类型的值设为一致(setTime()和getTime()这两个方法是精确到毫秒的),这样得到的值一定是准确的。