JS计算两日期相差月份,精确到小数

JS计算两日期相差月份,精确到小数


第一次写博客。。。之前一直都是写的JAVA,然后最近学了一下前端。项目有需要计算两个日期之间相隔的月份数,看到网上的大部分都是直接拿月份相减,感觉有点粗糙,mysql又没有类似oracle的month_between方法,timestampdiff勉强能用但是只能输出整数所以只能自己算了,算出来的值用oracle的函数验证过是正确的(这里有一点需要提前告知:我在代码中强制的加上了1天,也就是2019-06-21 至 2019-06-21算一天,如果按照正常的计算肯定是0,那没意义,所以在使用函数计算的时候请多加上一天,否则会有大约0.03也就是1 / 30左右的差值)。如果阅者发现了代码中的任何计算错误请务必在评论中告知,态度什么的倒是没什么关系。

// 计算两个日期之间相隔的月份
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;
  }

你可能感兴趣的:(学习)