第一次写博客,一般别人都有写。自己就比较懒,觉着没必要。but,我发现,好多关于这个问题的博客都错了。就给大家带来一个正确的。觉得不错的话,点点👍,让更多人看到!
事情是这样的:一天要做一个加减月份的需求,于是我找了一个方法就用上去了;
new Date().setMonth((new Date().getMonth()-1))//一个月
后来封装的时候猛的想起:如果是2022-3-31 减到2月份。结果会是多少呢?
好家伙!果然。意外了。2022-3-3
原因是:设置月份,然而并没有设置天数,结果是2022-02-31。但是2月没有31,2月28 + 3天。那不就是2022-3-3 了嘛!
于是我对其进行了改良。
思路是:判断当前月天数 是否大于 目标月份的天数。如果大于。就取目标月份的最大天数。如果小于那就没事了。同理,怎加月份也一样!冻手!冻手!确实想啸。
附上MDN 的解释。
// 减少几月 BUG:如果要到2月份,从31号减到2月,没有31,会输出3-2; 已解决
function reduceMonth(time, n){
let curDate = new Date(time)
let thisDate = curDate.getDate() //本月天数
let thisMonthInd = curDate.getMonth() //本月月份索引
let targetMonthInd = (thisMonthInd - n )/1 //目标月份索引
let targetMonthDay = getMonthDay(curDate.getFullYear(),targetMonthInd)
//目标月份天数
if(thisDate > targetMonthDay){
curDate.setMonth(targetMonthInd + 1, 0) //第二个参数为0 ,表示上月最后一天
}else{
curDate.setMonth(targetMonthInd)
}
return curDate
}
//获取某年月有多少天
function getMonthDay(year, month) {
let days = new Date(year, month + 1, 0).getDate()
return days
}
reduceMonth('2022-3-31',1)
// Mon Feb 28 2022 00:00:00 GMT+0800 (中国标准时间)
oj8k,雀食蟀!建议大家以后c,v的时候。多测测,哈哈哈。