You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:47:08