设为首页 加入收藏

TOP

Java按自然月计算两个日期相差的年月日
2014-11-24 07:23:56 来源: 作者: 【 】 浏览:1
Tags:Java 自然 计算 两个日期 相差 年月日

曾经我以为计算两个日期之差很简单,在给我的团队成员分配任务时,也觉得就是调用一个方法的问题,可是当我发现结果老是不对时,才发现原来JDK 提供的API中根本没有这样的方法,我也很恼火,也怪不得不少牛人在博客里怒斥Java标准库中对日期的处理晦涩不堪的现状,想这样的功能提供也是理所应当的,也就说明Date,Calendar中提供的日期处理的功能不够强大,因为已经有开源(Joda,某个知名的Java开源类库,在时间日期的处理上相比Java标准库更加强大且易用,IBM的日期类库中提供了强大的功能),各大论坛中对这个问题争论很多,可是很多都是考虑的比较简单,每个月按30天计算,可能你会说,计算的这么精确吗?答案是在一定的场合下是非常有必要的,在银行,图书馆过期图书计费,网络流量计费等,都是按照自然月来计算的,需要考虑的因素很多,而不是简单的30天,我现在需要的场合是Baby Care这款软件中,要计算Baby的年龄,就是xx years,xx months,xx days,因为很多人需要用这个看看小孩是否满月,是否周岁等,开始为了简单,我们按30天每月,后来有人反馈,计算方法不对,只好让用户选择,是每月按30天计算,还是按自然月计算。


按每月30天计算,论坛中常讨论的方法,,并且似乎也是没有问题的,但是往往计算的结果有时会相差一天:


下面是正确的解法:


问题的关键是过滤掉时分秒,保留日期部分。干的活象低通滤波器,滤掉高频杂波,保留低频信号,/86400000,就是把时分秒全忽略掉了。


解法1:


这篇博客对这个问题分析的比较透彻:http://blog.csdn.net/solomonxu/archive/2007/04/27/1587237.aspx


解法2:


http://blog.csdn.net/rmartin/archive/2006/12/22/1452867.aspx;http://butunclebob.com/ArticleS.UncleBob.JavaDates;


把date1,date2都设置为同样的时间,我曾经设置date1为00:00:00,date2为23:59:59秒,在非常情况下,1S之差也会导致计算的天数少1.


解法3:


上面的解法思想都一样,都是忽略的时分秒,相比之下,第一种方法最为简单,可是这些都是每月按30天计算的,自然月计算的方法系统API中没有,总不至于为了使用这个方法,去引用开源的库吧,但是这个问题的处理逻辑也是很复杂的,要考虑的因素很多,往往测试的时候,发现某种特例计算的结果不正确,煞为恼火,Java真不给力~~


基本上花了一下午的时间,去分析,然后画了流程图,写成代码,可能水平有限,方法虽然笨拙,但是还是能用的,如有不正确的地方,欢迎大家指正,也期待有更加简单巧妙的方法。



breezy


相应代码:


如果你有更好的方法,欢迎探讨:-)


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux环境下的C/C++基础调试技术 下一篇Ubuntu 64 bit 编译 Android

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·What Is Linux (2025-12-25 16:57:17)
·Linux小白必备:超全 (2025-12-25 16:57:14)
·Linux 常用操作命令 (2025-12-25 16:57:11)
·HTTP协议深度解析: (2025-12-25 16:21:03)
·HTTP 概述 - MDN (2025-12-25 16:21:00)