侧边栏壁纸
  • 累计撰写 106 篇文章
  • 累计创建 3 个标签
  • 累计收到 19 条评论
标签搜索

目 录CONTENT

文章目录

计算日期间隔自然月份和天数

卑微幻想家
2022-05-17 / 0 评论 / 0 点赞 / 123 阅读 / 2,110 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-17,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

给定两个时间,startTime和endTime。计算这两个时间的间隔月份数,不是整月计算天数,月份数按照自然月来计算。举几个例子:

startTime:2022-02-16 00:00:00

endTime:2022-06-15 23:59:59

这两个时间间隔4个月。

startTime:2022-02-16 00:00:00

endTime:2022-08-27 23:59:59

这两个时间间隔6个月12天。

startTime:2022-02-16 00:00:00

endTime:2022-02-28 23:59:59

这两个时间间隔13天。

这里要注意,23:59:59相当于第二天的凌晨了。

我将月份数和天数转换为了整数部分和小数部分。比如:12个月20天,转换为:12.20。如果不需要这种格式,可以自己处理。

下面看代码

public double monthInterval(Date startTime,Date endTime){
    Calendar startCalendar = Calendar.getInstance();
    startCalendar.setTime(startTime);

    Calendar endCalendar = Calendar.getInstance();
    endCalendar.setTime(endTime);

    // 23:59:59 算第二天凌晨
    startCalendar.add(Calendar.SECOND,1);
    endCalendar.add(Calendar.SECOND,1);

    // 数据校验
    if (startTime.after(endTime)) {
        // 错误日期
        return -1;
    }

    int startYear = startCalendar.get(Calendar.YEAR);
    int endYear = endCalendar.get(Calendar.YEAR);
    int startMonth = startCalendar.get(Calendar.MONTH) + 1;
    int endMonth = endCalendar.get(Calendar.MONTH) + 1;
    int startDay = startCalendar.get(Calendar.DAY_OF_MONTH);
    int endDay = endCalendar.get(Calendar.DAY_OF_MONTH);

    log.info("startYear:{},startMonth:{},startDay:{}", startYear, startMonth, startDay);
    log.info("endYear:{},endMonth:{},endDay:{}", endYear, endMonth, endDay);

    int diffYear = endYear - startYear;

    if (endMonth < startMonth && diffYear != 0){
        diffYear = diffYear - 1;
    }

    //天数相等
    if (startDay == endDay){
        return diffYear * 12 + endMonth - startMonth;
    }else {
        int diffMonth = endMonth - startMonth;
        if (endMonth < startMonth){
            diffMonth = 12 - startMonth + endMonth;
        }
        if (endDay < startDay){
            diffMonth = diffMonth - 1;
        }

        int monthInterval = diffYear * 12 + diffMonth;

        //计算相差天数
        //预期月份后的日期
        startCalendar.add(Calendar.MONTH,monthInterval);
        int actualMaxDay = startCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        int expectMonth = startCalendar.get(Calendar.MONTH) + 1;

        int diffDay;
        double diffDayDouble;
        if (expectMonth == endMonth){
            diffDay = endDay - startDay;
        }else {
            diffDay = actualMaxDay - startDay + endDay;
        }
        
        // 将天数转换为小数
        if (diffDay <= 10){
            diffDayDouble = new BigDecimal(diffDay).divide(new BigDecimal("10"),1,RoundingMode.HALF_UP).doubleValue();
        }else {
            diffDayDouble = new BigDecimal(diffDay).divide(new BigDecimal("100"),2,RoundingMode.HALF_UP).doubleValue();
        }

        return monthInterval + diffDayDouble;
    }
}
0

评论区