这才是真正的js获取任意两个日期间的所有月份

warning: 这篇文章距离上次修改已过450天,其中的内容可能已经有所变动。

这才是真正的js获取任意两个日期间的所有月份

js setFullYear与setMonth的坑

系统上线后,突然收到妹子的反馈,销售汇总查询报表页面显示的月份与实际销售月份不一致!我随即登上系统,按妹子的查询条件,查询数据,然后再查询实际销售数据,果然如妹子所说的,数据有问题,难道逻辑出错?然后我再导出报表对比,数据没问题,那好办,应该是前端展示错了。

为了再印证一下判断,浏览器F12开发者模式,抓了一下包,返回的数据正常,那么这回肯定是前端的锅了。话说前端也是我写的 :laughing:。很快定位到getMonthBetween,之前偷懒使用CV大法从网上抄来简单改改就用了,还好没变成自主创新

 /**
     * 获取两个日期之间所有的年月
     * 返回/["2016-07", "2016-08", "2016-09", "2016-10"....]
     */
     getMonthBetween(start, end) {
        console.log('begin>>',start,'end>>',end)
      var result = []
      var s = start.split('-')
      var e = end.split('-')
      if (!start || !end) {
        var currentDate = new Date()
        var year = currentDate.getFullYear()
        var month = currentDate.getMonth() + 1 // 获取月份,并加1

        // 如果月份是一位数,在前面添加一个0
        if (month < 10) {
          month = '0' + month
        }

        return [`${year}-${month}`, `${year}-${month}`]
      }
      var min = new Date()
      var max = new Date()
      min.setFullYear(s[0], s[1])
      max.setFullYear(e[0], e[1])
      var curr = min
      while (curr <= max) {
        var month = curr.getMonth()
        console.log('curr.getMonth()>>',month)
        var str =
          (month == 0 ? curr.getFullYear() - 1 : curr.getFullYear()) +
          '-' +
          (month == 0 ? 12 : month < 10 ? '0' + month : month)
        var s = curr.getFullYear() + '-12'
        if (str == s) {
          str = curr.getFullYear() + '-12'
        }
        result.push(str)
        curr.setMonth(month + 1)
      }
      return result
    };

    getMonthBetween('2023-01-01','2023-03-05')

上面的代码输入getMonthBetween('2023-01-01','2023-03-05'),控制台输出,是不是很神奇?
image-20230831161326577

随后我一行行的看代码,感觉没什么问题,只好下断点,在getMonth处执行几次后发现比较奇怪的现象。setFullYear(2023,1),再getMonth时,值已经是2了。再查了下setFullYear参数,Date.setFullYear(year,month,day)。month是0开始的,但是如果是从0开始,那更不应该是2啊,网上找了一圈也没找到想要的答案。索性把参数==天==也加上setFullYear(2023,1,1),这回输出正常了,==看来要把参数补全==。

后面的setMonth也是同样的问题,就不再赘述了,自主创新的代码如下:

getMonthBetween(start, end) {
      var result = []
      var s = start.split('-')
      var e = end.split('-')
      if (!start || !end) {
        var currentDate = new Date()
        var year = currentDate.getFullYear()
        var month = currentDate.getMonth() + 1 // 获取月份,并加1

        // 如果月份是一位数,在前面添加一个0
        if (month < 10) {
          month = '0' + month
        }

        return [`${year}-${month}`, `${year}-${month}`]
      }
      var min = new Date()
      var max = new Date()
      //月份参数要从0开始的,所以要-1
      //为防止后面月份比较时多加一个月份,这里都以1号为准
      min.setFullYear(s[0], s[1] - 1, 1)
      max.setFullYear(e[0], e[1] - 1, 1)
      var curr = min
      while (curr <= max) {
        //从0开始的
        var month = curr.getMonth()
        var sMonth = month + 1 < 10 ? '0' + (month + 1) : month + 1
        var str = curr.getFullYear() + '-' + sMonth
        result.push(str)
        //下一个月,这个1号必须传入,否则会错乱
        curr.setMonth(month + 1, 1)
      }
      return result
    }

最终效果:

image-20230831153159708

评论已关闭