JavaScript获取指定日期前一天异常,求原因及修正方法
为什么JavaScript中获取指定日期前一天得到了错误的年份和月份?
嘿,这个问题我之前也踩过坑!先来看你的代码:
var d = new Date("2019","12","21"); d.setDate(d.getDate() - 1 ); alert(d.getFullYear()+"-"+d.getMonth()+"-"+d.getDate());
你预期得到2019-12-20,但实际返回2020-0-20,核心原因是JavaScript的Date对象月份是从0开始索引的——0对应1月,11对应12月,这是很多新手容易忽略的点。
错误原因拆解:
当你传入"12"作为月份参数时,Date会把它当作第13个月(因为0是第一个月),而一年只有12个月,所以引擎会自动做日期转换:13个月 = 1年 + 1个月,所以你的初始日期new Date("2019","12","21")实际上被解析成了2020年1月21日。
之后你调用d.setDate(d.getDate() - 1),把日期减一天,就得到了2020年1月20日。而getMonth()返回的是0(因为1月对应索引0),所以最终输出就是2020-0-20了。
修正方案
这里有两种可靠的修改方式:
方案1:手动调整月份索引
把代表12月的参数从"12"改成"11",同时输出月份时要加1(把索引转成实际月份):
var d = new Date("2019","11","21"); d.setDate(d.getDate() - 1 ); // 月份加1,确保显示1-12的实际月份 alert(d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate());
如果想要格式更规范(比如个位数日期补零),可以用padStart处理:
var d = new Date("2019","11","21"); d.setDate(d.getDate() - 1 ); const year = d.getFullYear(); const month = (d.getMonth() + 1).toString().padStart(2, '0'); const day = d.getDate().toString().padStart(2, '0'); alert(`${year}-${month}-${day}`); // 输出2019-12-20
方案2:使用标准日期字符串解析
直接传入"YYYY-MM-DD"格式的字符串,Date会自动正确解析月份,不需要手动调整索引:
var d = new Date("2019-12-21"); d.setDate(d.getDate() - 1 ); const year = d.getFullYear(); const month = (d.getMonth() + 1).toString().padStart(2, '0'); const day = d.getDate().toString().padStart(2, '0'); alert(`${year}-${month}-${day}`); // 输出2019-12-20
内容的提问来源于stack exchange,提问作者user10877666
相关产品推荐
相关产品推荐

