在做一个需求的时候, 碰到一个非常难办的需求:
用户在设置了宝宝出生日期的时候, 在页面上显示宝宝的年龄. 显示的格式为 “xx年xx个月xx天”.
乍一看很简单, 直接用 getTime() 减出毫秒数, 然后去模除就行了. 但是这个算法存在非常多的问题:
- 每个月的天数不一致.
- 如果时间跨度中有个闰年, 就非常恶心了.
当然, 大部分情况下有个几天的差距是看不出来的, 但是如果碰到一些比较极端的情况, 比如生日是 2011-01-01 到 2015-01-01 去查看的时候, 由于中间隔了一个2012的闰年, 这个问题就复杂了, 而且由于刚好是同一天, 所以哪怕有一点点差别都能发现是bug.
既然要做成通用的房费类, 那么干脆就做一个精准点的算法: “xx年xx月xx日xx小时xx分钟xx秒”.
基本设想如下, 类似于整数的减法, 只是每一位的进制不同.
比如月份的进制为12, 日的进制和当前所在的月有关, 小时的进制是24, 分钟进制是60.
很明显, 这里最复杂的就是月了. 当月份需要借位的时候, 需要计算 endDate 的上一个月的总天数.
基本思想说完了, 上代码
1 | private static class DateInterval { |
这里最复杂的一段就是在借位减法上, 如果借位导致了前一位的值为负值, 那么要再向前借位.
测试代码
1 | public static void main(String[] args) throws ParseException { |
返回如下:
1 | 4年11月30日23小时59分钟59秒 |