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;
};