上周有一场景需要显示上一月,遂使用date.setMonth来实现。
今天10月31日,得到消息说有bug,页面错误地显示了10月!!
当前就是10月,上月怎么会是10月呢??
带着百思不得其解的思绪,我开始排查,代码如下:
// 在组件类中添加一个方法来获取上一个月的名称
getPreviousMonth() {
const date = new Date();
date.setMonth(date.getMonth() - 1);
const monthNames = ["1 月", "2 月", "3 月", "4 月", "5 月", "6 月",
"7 月", "8 月", "9 月", "10 月", "11 月", "12 月"];
return monthNames[date.getMonth()];
}
为了更好地排查,我打上了注释:
// 获取上个月时间
function getPreviousMonth() {
const date = new Date();
console.log("【调试】当前完整日期: ", date.toString()); // 打印完整日期
console.log("【调试】当前 getMonth() 值: ", date.getMonth()); // 打印月份索引
date.setMonth(date.getMonth() - 1);
console.log("【调试】减一个月后: ", date.toString());
const monthNames = ["1 月", "2 月", "3 月", "4 月", "5 月", "6 月",
"7 月", "8 月", "9 月", "10 月", "11 月", "12 月"];
console.log("【最终输出】", monthNames[date.getMonth()]);
return monthNames[date.getMonth()];
}
getPreviousMonth();
输出如下:
从【最终输出】 我们可以看到,打印出来的时间就是10月,而且还是10月1日,莫非是减去了30天!?
借助AI的问答,终于得出了最后的真相:
当前的系统时间是 2025年10月31日(根据之前的信息),当你执行
date.setMonth(date.getMonth() - 1)时,你试图将日期设置为 2025年9月31日。但是9月只有30天,不存在31日,所以 JavaScript 会自动将其调整为 2025年10月1日。这是 JavaScript Date 对象的一个特性:当你设置一个不存在的日期时,它会自动调整到下一个有效日期。
真令人震惊,date.setMonth原来还有这种特性!!以后使用date.setMonth返回上一月的小伙伴一定要注意哦~
热心的AI老师还提供了解决方案:先设置日期为1号,再减月份。
今天分享就到这里了~END