舍弃的原因是:当date的日值为28、29、30、31时,计算月份时会跳过没有这个日期的月份,例如:new Date(new Date(2023,3,31).setMonth(-1)),tanainaide居然是Thu Dec 01 2022 00:00:00 GMT+0800 (中国标准时间)。
选择了自己写一段丑陋的代码(没优化,希望我看得懂):
用法:let arr = getDateRange(-i, 2, '-', '_', new Date(), 2);
/*
@param: days [number] 相隔天数或月数(必须),正数表示将来,负数表示过去;
@param: type [number] 返回类型,1(默认)字符串,2数组;
@param: sign [string] 分隔符号(仅字符串有效);
@param: flag [string] 范围符号(仅字符串有效);
@param: sdate [date] 开始日期 (2020/01/02,斜杠格式);
@param: mode [number] 范围模式,1=days,2=month(以month计算时,days参数为相隔月数);
@return: [string,array]
*/
function getDateRange(
days,
type = 1,
sign = "/",
flag = "_",
sdate = new Date(),
mode = 1
) {
if (type == undefined) type = 1;
if (sign == undefined) sign = "/";
if (flag == undefined) flag = "_";
if (sdate == undefined) sdate = new Date();
if (mode == undefined) mode = 1;
// 强制替换参数日期的-为/
if (typeof sdate == "string" && sdate.indexOf("-") > -1) {
sdate = sdate.replace(/\-/g, "/");
}
let now = new Date(sdate);
let sy = now.getFullYear();
let sm = ("0" + (now.getMonth() + 1)).slice(-2);
let sd = ("0" + now.getDate()).slice(-2);
let start = sy + sign + sm + sign + sd;
let after = "";
if (mode == 1) {
// 日期模式
after = now.setDate(now.getDate() + days);
} else if (mode == 2) {
// 月份模式
let m = parseInt(sm) + days;
let afterY =
sy + (m < 1 ? parseInt(m / 12) - 1 : m > 12 ? parseInt(m / 12) : 0);
let afterM = m % 12;
afterM = afterM == 0 ? 12 : afterM < 1 ? 12 + afterM : afterM;
let afterMstr = ("0" + afterM).slice(-2);
let afterD = sd;
let startD = parseInt(sd);
let startM = parseInt(sm);
console.log("开始日期", sy, sm, sd);
// console.log("预期日期", afterY, afterM, afterD);
if (startD == 31) {
if ([1, 3, 5, 7, 8, 10, 12].indexOf(afterM) > -1) {
} else if ([4, 6, 9, 11].indexOf(afterM) > -1) {
afterD = 30;
} else if (afterM == 2) {
if (isLeapYear(afterY)) {
afterD = 29;
} else {
afterD = 28;
}
}
} else if (startD == 30 && [4, 6, 9, 11].indexOf(startM) > -1) {
if ([1, 3, 5, 7, 8, 10, 12].indexOf(afterM) > -1) {
afterD = 31;
} else if ([4, 6, 9, 11].indexOf(afterM) > -1) {
} else if (afterM == 2) {
if (isLeapYear(afterY)) {
afterD = 29;
} else {
afterD = 28;
}
}
} else if (startD == 29 && startM == 2) {
if ([1, 3, 5, 7, 8, 10, 12].indexOf(afterM) > -1) {
afterD = 31;
} else if ([4, 6, 9, 11].indexOf(afterM) > -1) {
afterD = 30;
} else if (afterM == 2) {
if (!isLeapYear(afterY)) {
afterD = 28;
}
}
} else if (startD == 28 && startM == 2) {
if ([1, 3, 5, 7, 8, 10, 12].indexOf(afterM) > -1) {
afterD = 31;
} else if ([4, 6, 9, 11].indexOf(afterM) > -1) {
afterD = 30;
} else if (afterM == 2) {
if (isLeapYear(afterY)) {
afterD = 29;
}
}
}
after = afterY + "/" + afterMstr + "/" + ("0" + afterD).slice(-2);
console.log("实际日期", after);
console.log("__________________________");
}
after = new Date(after);
if (mode == 2) {
if (days > 0) {
after = new Date(after.setDate(after.getDate() - 1));
} else if (days < 0) {
after = new Date(after.setDate(after.getDate() + 1));
}
}
let ey = after.getFullYear();
let em = ("0" + (after.getMonth() + 1)).slice(-2);
let ed = after.getDate() > 9 ? after.getDate() : "0" + after.getDate();
let end = ey + sign + em + sign + ed;
if (days >= 0) {
return type == 1 ? start + flag + end : [start, end];
} else {
return type == 1 ? end + flag + start : [end, start];
}
}