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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:25:20