如何获取指定日期前N个月的英文月份名称?JS代码问题排查
问题分析与解决方法
原代码问题
原代码的错误在于:d.setDate(d.getDate() - 180)返回的是时间戳(毫秒数),不是Date对象,所以无法直接调用getMonth()方法,会抛出TypeError: d.setDate(...).getMonth is not a function的错误。而且用减180天的方式计算月份不准确,不同月份天数不同,易导致月份偏差。
正确实现思路
要准确获取指定日期之前的N个月份,应直接操作日期的月份属性而非天数:
- 基于目标日期(2022年7月28日)创建Date实例;
- 循环N次,每次将月份减1,方法会自动处理年份切换(如1月减1月变为去年12月);
- 收集每个月份的英文缩写。
代码实现
获取最近6个月的英文月份缩写
// 设定当前日期为2022年7月28日(注意JS中月份是0-based,7月对应6) const currentDate = new Date(2022, 6, 28); const months = []; for (let i = 1; i <= 6; i++) { // 创建日期副本,避免修改原日期 const date = new Date(currentDate); // 减去i个月 date.setMonth(currentDate.getMonth() - i); // 获取英文月份缩写 const monthAbbr = date.toLocaleString('en-US', { month: 'short' }); months.push(monthAbbr); } console.log(months); // 输出: ["Jun", "May", "Apr", "Mar", "Feb", "Jan"]
获取最近12个月的英文月份缩写
只需修改循环次数为12:
const currentDate = new Date(2022, 6, 28); const months = []; for (let i = 1; i <= 12; i++) { const date = new Date(currentDate); date.setMonth(currentDate.getMonth() - i); const monthAbbr = date.toLocaleString('en-US', { month: 'short' }); months.push(monthAbbr); } console.log(months); // 输出: ["Jun", "May", "Apr", "Mar", "Feb", "Jan", "Dec", "Nov", "Oct", "Sep", "Aug", "Jul"]
代码说明
- 创建日期副本是为了避免循环中修改原日期,保证每次计算的基准正确;
setMonth()方法会自动处理年份切换,无需额外判断;toLocaleString('en-US', { month: 'short' })可直接获取标准英文月份缩写,兼容性好,无需手动维护月份数组。
内容的提问来源于stack exchange,提问作者kiolkiolk
相关产品推荐
相关产品推荐

