JS的Date.setMonth()方法坑

一、场景复现

业务需求,查询时间需要设置为前一个月。

//辅助代码
Date.prototype.format = function(fmt)   
{ //author: meizz   
  var o = {   
    "M+" : this.getMonth()+1,                 //月份   
    "d+" : this.getDate(),                    //日   
    "h+" : this.getHours(),                   //小时   
    "m+" : this.getMinutes(),                 //分   
    "s+" : this.getSeconds(),                 //秒   
    "q+" : Math.floor((this.getMonth()+3)/3), //季度   
    "S"  : this.getMilliseconds()             //毫秒   
  };   
  if(/(y+)/.test(fmt))   
    fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));   
  for(var 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;   
}  

//正式代码
let date = new Date("2019-3-29");
date.setMonth(date.getMonth()-1);
alert(date.format('yyyy-MM'));

输出:

2019-03

期待输出2019-02

 

二、分析原因

       在业务寻找问题的时候,测试输出date.format('yyyy-MM-dd'),看到的值为2019-03-01。从2019-03-01中我发现了原因,是因为2019-02-29此天不存在,故输出2019-03-01,这才导致了输出2019-03的问题。

       正确设置上个月份的的方式应该为date.setMonth(date.getMonth()-1,1);使用setMonth(month,date)来进行修改,而不是使用setMonth(month)方法,避免出现此类问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值