算两个日期相差天数之使用Calendar类型注意事项

来源:互联网 发布:手机网络赚钱资源 编辑:程序博客网 时间:2024/05/01 20:25
public int dis(String time1,String time2){//time1晚于time2int 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()这两个方法是精确到毫秒的),这样得到的值一定是准确的。

原创粉丝点击