您的当前位置:首页正文

解析JS在获取当前月的最后一天遇到的坑

2020-11-27 来源:星星旅游

咱们可以看到,我们把 1月31号往后拨一个月在往前减一天,理应得到的是 1月31号,实际得到的是 2月28号,所以咱们写的代码是有bug的。

这又是怎么肥事?

咱们可以列出月份:

1月 1 ....... 28 29 30 31
2月 1 ....... 28
3月 1 ....... 28 29 30 31

咱们通过 month + 1,在 JS 中会理解成:

当前日期 + 当月的天数

所以上例中的 date.setMonth(date.getMonth() + 1) 等价于 1月31号 + 31天 ,根据上面的列表,就可以看到结果是3月3号

所以不要认为 month + 1 就是月份加 1,它的意思是当前日期加上当月天数 。

那要怎么保证多了不会多跳一个月呢?

只要保证 month + 1 之前不会超过28号就行啦,那要怎么做到呢?

推算:

  • 31号 + 31 会超
  • 30号 + 31 会超
  • 29号 + 31 会超
  • 28号 + 31 还是 28 号 刚好
  • 所以秘诀在把31号回拨到28号就行啦,所以多加以下这句话就行了:

    date.setDate(28)

    完整代码:

    var date= new Date(2019, 0, 31); //0 表示1月
    date.setDate(28)
    date.setMonth(date.getMonth() + 1);
    // 日期设置为0号, 0表示1号的前一天
    let lastDay = date.setDate(0);
    console.log('最后一天:' + new Date(lastDay).toLocaleString()) 

    运行结果:

    最后一天:2019/1/31 上午12:00:00

    代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具Fundebug。