JS舍弃date.setMonth(month,[day])方法

舍弃的原因是:当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];

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
swiperChange(e) { if (this.data.backChange) { this.setData({ backChange: false, }); return; } //计算第三个索引 let rest = 3 - e.detail.current - this.data.oldCurrent; let dif = e.detail.current - this.data.oldCurrent; let date; if (dif === -2 || (dif > 0 && dif !== 2)) { //向右划的情况,日期增加 if (this.data.open) { date = new Date(this.data.selectDay.year, this.data.selectDay.month); this.setMonth(date.getFullYear(), date.getMonth() + 1, undefined); this.getIndexList({ setYear: this.data.selectDay.year, setMonth: this.data.selectDay.month, dateIndex: rest, }); } else { date = new Date( this.data.selectDay.year, this.data.selectDay.month - 1, this.data.selectDay.day + 7 ); this.setMonth( date.getFullYear(), date.getMonth() + 1, date.getDate() ); this.getIndexList({ setYear: this.data.selectDay.year, setMonth: this.data.selectDay.month - 1, setDay: this.data.selectDay.day + 7, dateIndex: rest, }); } } else { //向左划的情况,日期减少 if (this.data.open) { date = new Date( this.data.selectDay.year, this.data.selectDay.month - 2 ); this.setMonth(date.getFullYear(), date.getMonth() + 1, undefined); this.getIndexList({ setYear: this.data.selectDay.year, setMonth: this.data.selectDay.month - 2, dateIndex: rest, }); } else { date = new Date( this.data.selectDay.year, this.data.selectDay.month - 1, this.data.selectDay.day - 7 ); this.setMonth( date.getFullYear(), date.getMonth() + 1, date.getDate() ); this.getIndexList({ setYear: this.data.selectDay.year, setMonth: this.data.selectDay.month - 1, setDay: this.data.selectDay.day - 7, dateIndex: rest, }); } } this.setData({ oldCurrent: e.detail.current, }); this.setSwiperHeight(e.detail.current); },
06-12

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值