【Java】根据日历计算2个时间相差多少#自然#年、月、日、小时、分钟、秒

本文介绍了如何用Java通过竖式减法和Period类计算两个时间之间的自然年、月、日、小时、分钟、秒差值,详细分析了计算过程中的借位规则和特殊情况处理。
摘要由CSDN通过智能技术生成

iOS 自带了控件,可以自动根据日历来计算 2 个时间相差的自然年、月、日、小时、分钟、秒。Java 没有自带此方法,只能自己来算了~

一、竖式减法实现

我自己写了一个方法,测试了一些时间和 iOS 作对比,暂时没有发现什么问题。如有错误,欢迎指正,也欢迎提意见~

源码见:TimeIntervalUtils.java

主要方法是 int[] getTimeIntervalArray(Calendar nextDate, Calendar previousDate) 。

主要思路是:

根据数学的竖式减法,从低位由 "秒→年" 依次进行减法计算,不够则向前借一位。

这里先分别将 [年, 月, 日, 小时, 分钟, 秒] 每一位的差值计算出来,然后从低位开始由 "秒→年" 依次判断:如果小于 0 ,则向前借一位,当前位补上对应的值,前一位则需要减1。

补值这里应该也好理解:"秒"、"分"补 60,"时"补 24,"月"补 12

需要注意的是 "",也就是"天数"的处理。因为是按照日历上的日期来计算的日期差值,所以需要考虑到月份的问题,每个月的天数是不一样的,那么补值也是不一样的。每个月的天数可能有28、29、30、31天,这里我是按照截止日期 nextDate 的上一个月的天数来作补值的。比如 nextDate 是 20160229,那么上个月是 1 月份,补值是 31 天。

/**
 * 获取 2 个时间的自然年历的时间间隔
 *
 * @param nextDate     后面的时间,需要大于 previousDate
 * @param previousDate 前面的时间
 * @return [年, 月, 日, 小时, 分钟, 秒]的数组
 */
public static int[] getTimeIntervalArray(Calendar nextDate, Calendar previousDate) {
    int year = nextDate.get(Calendar.YEAR) - previousDate.get(Calendar.YEAR);
    int month = nextDate.get(Calendar.MONTH) - previousDate.get(Calendar.MONTH);
    int day = nextDate.get(Calendar.DAY_OF_MONTH) - previousDate.get(Calendar.DAY_OF_MONTH);
    int hour = nextDate.get(Calendar.HOUR_OF_DAY) - previousDate.get(Calendar.HOUR_OF_DAY);// 24小时制
    int min = nextDate.get(Calendar.MINUTE) - previousDate.get(Calendar.MINUTE);
    int second = nextDate.get(Calendar.SECOND) - previousDate.get(Calendar.SECOND);

    boolean hasBorrowDay = false;// "时"是否向"天"借过一位

    if (second < 0) {
        second += 60;
        min--;
    }

    if (min < 0) {
        min += 60;
        hour--;
    }

    if (hour < 0) {
        hour += 24;
        day--;

        hasBorrowDay = true;
    }

    if (day < 0) {
        // 计算截止日期的上一个月有多少天,补上去
        Calendar tempDate = (Calendar) nextDate.clone();
        tempDate.add(Calendar.MONTH, -1);// 获取截止日期的上一个月
        day += tempDate.getActualMaximum(Calendar.DAY_OF_MONTH);

        // nextDate是月底最后一天,且day=这个月的天数,即是刚好一整个月,比如20160131~20160229,day=29,实则为1个月
        if (!hasBorrowDay
                && nextDate.get(Calendar.DAY_OF_MONTH) == nextDate.getActualMaximum(Calendar.DAY_OF_MONTH)// 日期为月底最后一天
                && day >= nextDate.getActualMaximum(Calendar.DAY_OF_MONTH)) {// day刚好是nextDate一个月的天数,或大于nextDate月的天数(比如2月可能只有28天)
            day = 0;// 因为这样判断是相当于刚好是整月了,那么不用向 month 借位,只需将 day 置 0
        } else {// 向mon
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值