填报表自动计算俩日期相差月份精确到小数位

 

在填报表设计过程中可以通过自动计算调用 js 来实现俩个日期相差的月份;
例如:2018-8-16 和 2018-9-16 计算出来应该是一个月,2018-8-16 和 2018-9-17,计算出来应该是两个月。
如果想要再具体到相差几个月的小数位应该怎么实现呢?
实现方法:
在展示页面的 jsp 编写 javascript 代码:

<script language="javascript">
function calculateMonth(contractStartDate, contractEndDate) {
    const startFullMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    const endFullMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    const startDate = new Date(contractStartDate);
    const endDate = new Date(contractEndDate);

    // 开始日期参数
    const startYear = startDate.getFullYear();
    const startMonth = startDate.getMonth();
    const startDay = startDate.getDate();

    // 结束日期参数
    const endYear = endDate.getFullYear();
    const endMonth = endDate.getMonth();
    const endDay = endDate.getDate();

    // 判断开始日期是否为闰年
    if (startYear % 4 === 0 && startYear % 400 !== 0) {
      startFullMonth[1] = 29;
    }

    // 判断结束日期是否为闰年
    if (endYear % 4 === 0 && endYear % 400 !== 0) {
      endFullMonth[1] = 29;
    }

    // 计算月份
    const yearDiff = endYear - startYear;
    const monthDiff = endMonth - startMonth - 1;
    let result = 0;

    // 同年的情况下
    if (yearDiff === 0) {
      // 同月的情况下
      if (monthDiff === -1) {
        result = (endDay - startDay + 1) / startFullMonth[startMonth];
      }
      // 不同月情况下
      if (monthDiff > -1) {
        // 开始日是否小于结束日
        if (startDay <= endDay) {
          result =
            monthDiff +
            (startFullMonth[startMonth] - startDay + 1) / startFullMonth[startMonth] +
            endDay / endFullMonth[endMonth];
        } else {
          result =
            monthDiff +
            (startFullMonth[startMonth] - startDay + 1) / startFullMonth[startMonth] +
            endDay / endFullMonth[endMonth];
        }
      }
    }
    // 不同年的情况下
    if (yearDiff > 0) {
      result =
        yearDiff * 12 +
        monthDiff +
        (startFullMonth[startMonth] - startDay + 1) / startFullMonth[startMonth] +
        endDay / endFullMonth[endMonth];
    }
    return result.toString().substring(0,4);
  }

web 端预览效果

imagepng