日期按照整年拆分

221 阅读1分钟

需求:
输入:'2020-02-13','2021-03-01'
输出:[{startDate: '2020-02-13', endDate: '2021-02-12'},{startDate: '2021-02-13', endDate: '2021-03-01'}]

  /**
   * 按整年拆分日期
   * @param startDate
   * @param endDate
   */
  function splitDate(startDate, endDate) {
    let startTimestamp = Date.parse(startDate); // 开始日期时间戳
    let endTimestamp = Date.parse(endDate); // 结束日期时间戳
    let duringTimestamp = endTimestamp - startTimestamp; // 时间戳差
    let endYear = new Date(startTimestamp).getFullYear() + 1; // 一年期的终止年份
    let duringDay = isLeap(endYear) ? 366 : 365; // 闰年/平年
    // 一年以内:时间戳差值小于一年天数
    if (duringTimestamp / (60 * 60 * 24 * 1000) + 1 <= duringDay) {
      arr.push({ startDate, endDate });
      return;
    }

    // 一年以上
    let tempEndDate = new Date(startTimestamp).setFullYear(new Date(startTimestamp).getFullYear() + 1); // 拆分的下一年租期开始日期
    let tempDate = new Date(tempEndDate).setDate(new Date(tempEndDate).getDate() - 1); // 拆分的租期结束日期时间戳
    let newEndDate = patternDate(new Date(tempDate), 'yyyy-MM-dd'); // 拆分的租期结束日期时间戳转日期
    arr.push({ startDate, endDate: newEndDate });
    return splitDate(patternDate(new Date(tempEndDate), 'yyyy-MM-dd'), endDate);
  }
  
  /**
   * 是否闰年
   * @param year
   * @return {Boolean}
   */
  function isLeap(year) {
    return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
  }
  
  /**
   * 处理日期格式
   * @param date
   * @param fmt
   */
  function patternDate(date, fmt) {
    let o = {
      'M+': date.getMonth() + 1, //月份
      'd+': date.getDate(), //日
      'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, //小时
      'H+': date.getHours(), //小时
      'm+': date.getMinutes(), //分
      's+': date.getSeconds(), //秒
      'q+': Math.floor((date.getMonth() + 3) / 3), //季度
      S: date.getMilliseconds(), //毫秒
    };
    let week = {
      '0': '/u65e5',
      '1': '/u4e00',
      '2': '/u4e8c',
      '3': '/u4e09',
      '4': '/u56db',
      '5': '/u4e94',
      '6': '/u516d',
    };
    if (/(y+)/.test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    }
    if (/(E+)/.test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        (RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '/u661f/u671f' : '/u5468') : '') +
        week[date.getDay() + '']
      );
    }
    for (let k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) {
        fmt = fmt.replace(
          RegExp.$1,
          RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
        );
      }
    }
    return fmt;
  }