JS范围日期切片

js时间分割——主要用途——租赁合同时间计算(两种时间分割方式,可以按月,季,年分割)

在这里插入图片描述
在这里插入图片描述


    //1.月 2.季	3.半年 4.年
    var dateSliceList = dateSplit(dateCutByMonth_1(_sxrqStr, _zzrqStr));
    console.log('日期切片', dateSliceList);


    /**
     *
     * @param beginDate 开始时间
     * @param endDate 结束时间
     * @returns {[{beginDate: *, endDate: *}]}
     */
    function dateCutByMonth_1(beginDate, endDate) {
        let beginDateList = []; // 开始时间集合
        let endDateList = []; // 结束时间集合
        // 计算两个月份相差时间差
        let monthNum = mouthDifferCount(beginDate, endDate);
        if (monthNum) {
            // 计算每个月的开始时间
            beginDateList = getBeginDate(monthNum, beginDate, endDate);
            // 计算每个月的结束时间
            endDateList = getEndDate(beginDateList, beginDate, endDate);
        } else {
            endDateList = [{ beginDate, endDate }]
        }
        return endDateList
    };

    /**
     * 计算每个月的开始时间
     * @param numMonth
     * @param beginDate
     * @param endDate
     * @returns {[]}
     */
    function getBeginDate(numMonth, beginDate, endDate) {
        let _beginDay = beginDate.split('-')[2]; // 开始日期当前天
        let _endDay = endDate.split('-')[2]; // 结束日期当前天
        let nextForDate = beginDate; // 开始日期
        let dateCutList = []
        for (let i = 0; i < numMonth; i++) {
            var now = new Date(nextForDate); // 获取往后每个月的当前日期
            var year = now.getFullYear(); // 获取每个月间隔的当前年
            var month = now.getMonth() + 1; // 获取每个月的当前月分
            var day = _beginDay; // 当天日期
            // 月份补0(例: '9' >>> '09')
            month = parseInt(month) < 10 ? '0' + month : month;
            // 拼接出每个月份的日期
            now = year + '-' + month + '-' + day; // 若是取当月日期可直接 return 返回
            var nextMonth = parseInt(month) + 1; // 下一个月
            // 月份补0(例: '9' >>> '09')
             nextMonth = nextMonth < 10 ? '0' + nextMonth : nextMonth; // 获取下个月个月的值
            // 月份超过12, 则年份+1; 月份则置于1月份
            if (nextMonth > 12) {
                year += 1;
                nextMonth = '01';
            }
            // 下月总天数
            var nextSize = new Date(year, parseInt(month) + 1, 0).getDate();
            // 若是下个月总天数小于本月今天,取下个月最后一天
            if (nextSize < parseInt(day)) {
                nextForDate = year + '-' + nextMonth + '-' + nextSize;
                dateCutList.push(nextForDate);
            } else if (nextSize >= parseInt(day)) {
                nextForDate = year + '-' + nextMonth + '-' + day;
                dateCutList.push(nextForDate);
            }

            var time1 = new Date(dateCutList[dateCutList.length - 1]).getTime(); // 可能存在的止租日期
            var time2 = new Date(endDate).getTime(); // 止租日期
            if (time1 > time2) {
                dateCutList.pop();
            }
        }
        return dateCutList
    };
    
    /**
     * 计算每个月的结束时间
     * @param beginDateList 开始时间集合
     * @param beginDate 开始时间
     * @param endDate 结束时间
     * @returns {[]}
     */
    function getEndDate(beginDateList, beginDate, endDate) {
        var _beginDateList = beginDateList || [];
        _beginDateList.unshift(beginDate); // (在开头)向数组添加初始开始时间
        var endDateList = []; // 结束时间集合
        _beginDateList.forEach((item, index) => {
            let date1 = new Date(_beginDateList[index + 1]);
            let date2 = new Date(date1.getTime() - 24 * 60 * 60 * 1000);
            let y2 = date2.getFullYear();
            let m2 = date2.getMonth() + 1 < 10 ? '0' + (date2.getMonth() + 1) : date2.getMonth() + 1;
            let d2 = date2.getDate() < 10 ? '0' + date2.getDate() : date2.getDate();
            let endDate = y2 + "-" + m2 + "-" + d2
            endDateList.push({ "growthStartDate": item, "growthEndDate": endDate })
        });
        endDateList[endDateList.length - 1]['growthEndDate'] = endDate
        let endBeginDateGetTime = new Date(endDateList[endDateList.length - 1]['growthStartDate']).getTime()
        let endDateGetTime = new Date(endDateList[endDateList.length - 1]['growthEndDate']).getTime()
        if (endBeginDateGetTime > endDateGetTime) {
            endDateList.pop()
        }
        return endDateList;
    };

    /**
     * 计算两个月份相差时间差
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @returns {number}
     */
    function mouthDifferCount(startDate, endDate) {
        // 拆分年月日
        var startDateSplit = startDate.split('-'); // ["2023", "04", "17"]
        var startYear = startDateSplit[0] || ''; // 2023
        var startMonth = startDateSplit[1] || ''; // 04
        // 得到总月数(年份 * 12 + 当前月份)
        var startMonthTotal = parseInt(startYear) * 12 + parseInt(startMonth);
        // 拆分年月日
        var endDateSplit = endDate.split('-'); // ["2024", "04", "17"]
        var endYear = endDateSplit[0] || ''; // 2024
        var endMonth = endDateSplit[1] || ''; // 04
        // 得到总月数(年份 * 12 + 当前月份)
        var endMonthTotal = parseInt(endYear) * 12 + parseInt(endMonth);
        var times = Math.abs(startMonthTotal - endMonthTotal);
        return times;
    };
    
    /**
     * 1.月 2.季	3.半年 4.年
     * @param data
     * @returns {[]}
     */
    function dateSplit(data) {
        var num = 1, result = [], lastResult = [];
        // 1.月 2.季	3.半年 4.年
        switch (String(htglAppData.htglData.amounIncreaseFrequency || '1')) {
            case '1':
                num = 1;
                break;
            case '2':
                num = 3;
                break;
            case '3':
                num = 6;
                break;
            case '4':
                num = 12;
                break;

        }
        for (var i = 0; i < data.length; i += num) {
            result.push(data.slice(i, i + num));
        }
        for (var i = 0; i < result.length; i++) {
            lastResult.push({
                growthStartDate: result[i][0].growthStartDate,
                growthEndDate: result[i][result[i].length - 1].growthEndDate,
            });
        }
        return lastResult;
    };
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值