日期:2014-05-17  浏览次数:20658 次

求2个时间相减得到年月日时分的问题?+急急急
我想将2个日期相减分别得到年 月 日 时 分

得到年没问题,关键是下面的得到月,天,时,分 出现问题了

//年
FALSE_YEAR=((HR_DAYTO.getTime()-HR_DAYFROM.getTime())/(24*60*60*1000))/365;
//月
false_month=((HR_DAYTO.getTime()-HR_DAYFROM.getTime())/(24*60*60*1000))/30;

//日
false_day=(HR_DAYTO.getTime()-HR_DAYFROM.getTime())/(24*60*60*1000);

//时
false_hour=(HR_DAYTO.getTime()-HR_DAYFROM.getTime())%(24*60*60*1000)/3600;

// 分
false_min=(HR_DAYTO.getTime()-HR_DAYFROM.getTime())%(60*60*1000)/60;



如果当天数大于30 天就出现问题了,如 天数我35天,正确的结果为 1个月35天才对。我是将2个日期相减,得到的年月日,时分,是分开的,不是合在一起的,要将相减得到的日期,拆成年月日时分,

效果为:如 2013-5-5 ,2012-4-5 那么显示的效果为
年:1
月:1
日:0 , 当然的我的问题主要是当天数大于30天后,要自动的进位,月份也是如此,不知道要怎么弄,这是在java 中不是在数据库中。。。。求高手






------解决方案--------------------
请查看java.util.Calendar

------解决方案--------------------
写一个不太准确的,

_YEAR = (24*60*60*1000) * 365;  //计算一年的时间转换成与getTime的相同,
_MONTH = (24*60*60*1000) * 30;
_DATE = 24*60*60*1000;

相差几年 = (date1.getTime() - date2.getTime()) / _YEAR
相差几月 = (date1.getTime() - date2.getTime() - 相差几年 * _YEAR) / _MONTH
下面的类似了
------解决方案--------------------
或者这样,
先判断哪个日期大,
将其转换为,比如:date1 =2013-04-18,转换为  year1 =2013, month1 = 4, d1 = 18
date2 = 2012-07-30,转换为 year2 = 2012,month2 = 7,d2 = 30

年之间的差距  y = (month1 - month2)>0 ? (year1 - year2) : (year1 - year2) - 1;
月之间的差距  m = (d1-d2)>0 ? ((month1 - month2)>0 ?(month1 - month2) : (month1 - month2 + 12)) : ((year1 - year2) * 12 + month1 - month2) - 1;
天之间的差距  d = (d1-d2)>0 ? (d1-d2) : (d1-d2) + 计算year1上个月的天数(这个好计算的)

------解决方案--------------------
- - 这个需求其实蛮简单的,获得两个事件的Long类型表示方式,然后把它们相减,会得到一个差值,然后再把这个差值转换成date类型,会得到一个时间,如果这个差值不大的话,这个时间应该是197x.xx.xx,然后你吧197去掉差不多了,因为时间运算是从1970.00.00开始算起的,因此相减然后从新序列化的时间,也是这样累加上来的,只要去掉前面的1970就能得到时间差。
------解决方案--------------------
说错了,是1970.01.01 08:00:00 基本上减去这个基数,就可以得到的
------解决方案--------------------
引用:
无语中,你们到底明没明白什么我的需求啊,没明白前,请不要发表评论,影响心情。。。,我的需求是如果

天数为大于30天,后 自动的进位到月, 如33天,应该为1月3天。这样才对


我知道你的需求,java的时间函数与日期函数会自动的把你输入的时间完成进位,因此你不用担心的,只要你吧输入的字符串按规则转换成date类型就可以了。
------解决方案--------------------
如果不信,可以自己写个方法测试一下
------解决方案--------------------
例如你输入时间 1986-05-45 用dateformat完成格式化,会自动转换成 1986-06-14。这不需要自己去计算
------解决方案--------------------
没错,用simpledateformate会自动完成溢出进位,
如果相减的话,可以使用Calendar类可以实现,这个类也会自动完成加减进位。
其实日期都是long类型数据,只不过将它格式化成xxxx年xx月xx日而已,因此将其转换成long进行数学计算,然后再格式化成日期是比较正确的操作。
------解决方案--------------------