js Date对象中setMonth()的一些缺陷

关于JS的setMonth方法

例子:targetDate = 2022/7/31
需求:取到目标日期前1个月的日期
理想结果:2022/6/30

已下为示例代码:

var targetDate = new Date("2022/7/31");
targetDate.setMonth(targetDate.getMonth() - 1);
console.log("targetDate",targetDate);

js运行结果:2022/7/1

如何解决这个问题而得到目标值?
探究其中的原因,是因为js只是将月份减去或加上对应的月份,对于日期并没有做更改。
即通过setMonth之后,得到的日期为 2022/6/31,导致日期数据溢出,自动转为 2022/7/1。
查看其它博主建议解决方法,是setMonth(targetDate.getMonth() - 1,1);这样可以保证得到的月份是对的,但是日期不是我需要的。
以下为我的解决方案,将多出来的日期,强行减掉

/**
* @param num - 为需要增加或者减去的月份数
* @return {Date}
*/
Date.prototype.setDateMonth = function (num) {
    if (isNaN(num)) return NaN;
    var targetDate = this;
    var cy_mm = num % 12;
    var origin_mm = targetDate.getMonth();
    targetDate.setMonth(Number(targetDate.getMonth()) + Number(num));
    while(true){
        if (targetDate.getMonth() - origin_mm == cy_mm) break;
        if (origin_mm - targetDate.getMonth() == cy_mm) break;
        if (origin_mm - targetDate.getMonth() == -12 - cy_mm) break;
        if (origin_mm - targetDate.getMonth() == 12 - cy_mm) break;
        if (targetDate.getMonth() - origin_mm == 12 - cy_mm) break;
        if (targetDate.getMonth() - origin_mm == -12 - cy_mm) break;
        targetDate.setDate(targetDate.getDate() - 1);
    }
    return targetDate;
}
var targetDate = new Date("2022/7/31");
targetDate.setDateMonth(- 1);
console.log("targetDate",targetDate);

js运行结果:2022/6/30

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值