JS的Date对象固定月份增减日期功能异常如何修复
问题原因
你编写的日期加1逻辑可以正常运行,是因为加1跨月后得到的日期永远是下个月1号,任意月份都存在1号,所以直接把月份改回原月份不会出现异常。
而减1逻辑出错的核心原因是:减1跨月后得到的是上个月的最后一天(可能是28/29/30/31号),直接把月份改回原月份时,如果原月份没有对应天数,JS会自动将日期向后溢出,比如11月没有31号,设置2021-11-31会自动转为2021-12-01,极端情况就会出现你遇到的跳转到12月31日的问题。
修复方案
跨月回设日期时,不要仅修改月份,而是直接将日期设置为原月份的最后一天,避免日期溢出:
let cur_date = new Date(); setInterval(() => { const curYear = cur_date.getFullYear(); const curMonth = cur_date.getMonth(); const curDay = cur_date.getDate(); cur_date.setDate(curDay - 1); // 出现跨月则回设为原月份最后一天 if (cur_date.getMonth() !== curMonth) { // 获取当前原月份的总天数 const lastDay = new Date(curYear, curMonth + 1, 0).getDate(); cur_date.setFullYear(curYear, curMonth, lastDay); } console.log(cur_date.toLocaleString()); }, 1000);
内容的提问来源于stack exchange,提问作者David Abramov
相关产品推荐
相关产品推荐

