为何JavaScript处理2022-10-31日期时出现异常?
问题原因解析
1. new Date('2022', '10','31')得到11月1日的核心原因
JavaScript的Date对象有个极易踩坑的规则:月份参数是从0开始索引的——简单对应关系:
- 0 = 1月,1 = 2月……9 = 10月,10 = 11月,11 = 12月
你写的new Date('2022', '10','31')里,第二个参数'10'实际指向的是11月,但11月只有30天。当你试图给11月设置31日时,Date会自动处理日期溢出:把超出当月的天数折算到下一个月,31天等于11月的30天加1天,最终日期会被调整为12月1日。你看到的1-11应该是显示时的格式问题(比如没把getMonth()的返回值加1),但根本问题是没搞清楚月份的0索引规则。
如果要创建2022年10月31日,正确写法是:
new Date('2022', '09', '31') // 第二个参数传09,对应10月
2. 10月1日调用setDate()加30天得到11月1日的原因
先明确setDate()的工作逻辑:它接收的参数是当月的天数,如果参数超过当前月份的最大天数,会自动溢出到下个月。
2022年10月有31天,从10月1日调用date.setDate(date.getDate() + 30)的话,1 + 30 = 31,这正好是10月的最后一天,正常应该得到10月31日。你得到11月1日,大概率是代码写法有问题:
- 比如误写成
date.setDate(30)(直接设置为当月30号,这显然不符合加30天的逻辑) - 或者初始日期不是10月1日,而是9月30日?
如果确实是从10月1日出发加30天却得到11月1日,建议检查代码里的日期初始值和setDate()的调用逻辑。但如果是调用setDate(31)之后再加天数,或者其他溢出场景,就会触发Date的自动调整机制。
内容的提问来源于stack exchange,提问作者Kasi-Laubfrosch
相关产品推荐
相关产品推荐

