需求:
输入:'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;
}