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

	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()这两个方法是精确到毫秒的),这样得到的值一定是准确的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血大婶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值