setMonth与getMonth返回值不一致问题原因咨询
为什么设置Date月份后getMonth返回值不符合预期?
嘿,这个问题我之前排查过好几次,其实是JavaScript Date对象的自动日期溢出机制在起作用!
核心原因:日期溢出自动调整
首先得明确,JavaScript的月份是0索引的(0对应1月,5对应6月,11对应12月),但这不是你遇到问题的关键。真正的问题出在:当你设置月份时,如果当前日期的天数超过了目标月份的最大天数,Date对象会自动把日期往后顺延,导致月份“跳级”。
举个具体的例子,假设你运行代码时,当前日期是31号(比如当天是5月31日):
- 当执行
date.setMonth(5),你想把月份改成6月,但6月只有30天,没有31号。这时候Date会自动把日期往后推1天,变成7月1日,所以date.getMonth()自然返回6(对应7月)。 - 而执行
date.setMonth(4)时,目标是5月,5月有31天,刚好能容纳当前的31号,所以日期不会溢出,月份保持为5月,getMonth()就返回4了。
验证代码
你可以跑这段代码直观看到效果:
// 手动初始化日期为5月31日 const date = new Date(2024, 4, 31); // 2024-05-31 date.setMonth(5); console.log(date); // 输出 2024-07-01T00:00:00.000Z console.log(date.getMonth()); // 6 date.setMonth(4); console.log(date); // 输出 2024-05-31T00:00:00.000Z console.log(date.getMonth()); // 4
解决办法
如果想避免这种自动溢出,你可以先把日期设置为目标月份的有效天数(比如每月1号),再修改月份:
const date = new Date(); date.setDate(1); // 先将日期设为当月1号,避免溢出 date.setMonth(5); console.log(date.getMonth()); // 5,对应6月,符合预期
内容的提问来源于stack exchange,提问作者Gergely Fehérvári
相关产品推荐
相关产品推荐

