非闰年2月日历切换异常问题求助:跳转至2023年2月时显示3月,闰年场景功能正常
解决非闰年2月日历显示异常的问题
这个问题的核心原因在于JavaScript Date对象的自动日期溢出处理:当你调用setMonth()时,如果当前日期超出了目标月份的最大天数,Date会自动将日期滚动到下一个月。举个例子:如果当前系统日期是31号(比如1月31号),当你把月份设置为1(对应2月),2023年的2月只有28天,Date会自动调整为3月3号,此时getMonth()返回的是2(对应3月),自然就显示成3月了。
修复方案
解决方法很简单:在调整月份之前,先把日期设置为当月的第一天,这样就不会出现日期溢出的情况。修改后的代码如下:
let nav = 0; let test = () => { const dt = new Date(); dt.setDate(1); // 关键修改:先将日期设为1号,避免日期溢出 dt.setMonth(new Date().getMonth() + nav); const month = dt.getMonth(); const year = dt.getFullYear(); const monthName = `${dt.toLocaleDateString("en", { month: "long" })} ${year}`; document.getElementById('feedBack').innerHTML = 'Nav: ' + nav + ' - Day: ' + 1 + ' - Month: ' + month + ' ( <b>' + monthName + '</b> ) - Year: ' + year; } test();
#feedBack {margin-top:10px}
<button onclick="nav--;test()">Prev</button> <button onclick="nav=0;test();">Current</button> <button onclick="nav++;test()">Next</button> <div id="feedBack"></div>
修改说明
- 新增
dt.setDate(1):在调整月份之前,强制将日期设置为1号。这样无论当前系统日期是几号,调整月份时都是从目标月份的1号开始,不会触发Date的自动溢出逻辑。 - 这样当你切换到2023年2月时,Date对象会正确指向2023年2月1号,
getMonth()返回1,显示的月份名称就是February 2023,完全符合预期。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

