这才是真正的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')
,控制台输出,是不是很神奇?
随后我一行行的看代码,感觉没什么问题,只好下断点,在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
}
最终效果:
评论已关闭