AngularJS下拉列表月份过滤器问题:循环缺二月,需显示近3个月
解决循环生成月份时缺失二月的问题
嘿,我一眼就看出问题出在哪了!你遇到的二月缺失问题,根源在于Date.setMonth()的一个“小陷阱”:当你当前日期是某个月的最后几天(比如3月31日、1月31日),如果要切换到的月份没有这么多天,浏览器会自动把日期滚动到下一个月,导致月份计算错误。举个例子:如果今天是3月31日,调用setMonth(1)(对应二月),因为二月最多只有28/29天,这个操作会把日期变成3月3日左右,此时getMonth()返回的就是2(三月),自然就跳过二月了。
下面给你两个靠谱的解决方案:
方案一:固定日期为当月第一天(最简单)
修改你的代码,在创建previousMonth时先把日期设为1号,这样就不会出现因天数不足跳月的情况:
$scope.months = []; var myDate = new Date(); // 先把日期设为当月第一天,避免跳月问题 var previousMonth = new Date(myDate.getFullYear(), myDate.getMonth(), 1); for(var i=0; i<3; i++){ // 你要最近3个月,这里循环3次就够啦 var targetMonth = myDate.getMonth() - i; var targetYear = myDate.getFullYear(); // 处理跨年的情况(比如当前是1月,要取去年12月、11月) if(targetMonth < 0){ targetMonth += 12; targetYear -= 1; } // 直接设置年份和月份,日期保持1号 previousMonth.setFullYear(targetYear, targetMonth); var monthName = $filter('date')(previousMonth, 'MMMM'); var year = $filter('date')(previousMonth, 'yyyy'); $scope.months.push({name: monthName, year: year}); console.log(`${monthName} ${year}`); }
方案二:直接计算年月,不修改Date对象(更稳妥)
如果你不想依赖Date对象的自动调整,可以直接通过计算得到目标年月,再格式化:
$scope.months = []; var currentYear = new Date().getFullYear(); var currentMonth = new Date().getMonth(); // 0=一月,11=十二月 for(var i=0; i<3; i++){ var targetMonth = currentMonth - i; var targetYear = currentYear; if(targetMonth < 0){ targetMonth += 12; targetYear -= 1; } // 用Date构造器创建对应年月的第一天,再格式化 var dateObj = new Date(targetYear, targetMonth, 1); var monthName = $filter('date')(dateObj, 'MMMM'); $scope.months.push({name: monthName, year: targetYear}); console.log(`${monthName} ${targetYear}`); }
这两种方案都能完美解决二月缺失的问题,而且逻辑更清晰。另外注意你原来的循环是i<4,如果需求是最近3个月,改成i<3就可以啦~
内容的提问来源于stack exchange,提问作者TB.M
相关产品推荐
相关产品推荐

