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

JavaScript日期数组处理:表头年月生成的索引问题

问题:生成正确的年月表头数组

我要做一个表头为年月数组的表格,结构大概是这样:

month1/year, month2/year, month3/year, etc....
field1:
field2:
field3:

表头的年月由用户提供的起止日期决定。参考方案后逻辑基本实现,但遇到个问题:用getMonth()获取月份时返回的是索引值(比如一月对应0)。我一开始想直接加1,但又担心十二月到一月的过渡会出问题,目前只会用if语句在最终数组生成后调整,自己JS能力比较弱,想找更好的办法。

我的代码如下:

function dateRange(startDate, endDate, steps = 1) {
   const dateArray = [];
   let currentDate = new Date(startDate);
      
   while (currentDate <= new Date(endDate)) {
   dateArray.push(new Date(currentDate));
   // 用UTC日期避免时区和夏令时问题
   currentDate.setUTCDate(currentDate.getUTCDate() + steps);
   }
        
   console.log("dateArray: ", dateArray)

   const monthSet = dateArray.map(i => `${i.getMonth()}/${i.getFullYear()}`)
   const header = [...new Set(monthSet)]
   return header;
}
const dates = dateRange(isStart, isEnd);
console.log(dates);

解决方案

你完全不用怕直接给getMonth()的结果加1会有过渡问题——这里只是把每个日期的月份索引转换成实际显示的月份数字,和日期对象本身的月份切换逻辑没关系,每个日期都是独立处理的。

直接修改map里的代码就行:

const monthSet = dateArray.map(i => `${i.getMonth() + 1}/${i.getFullYear()}`)

比如输入起止日期是2024-12-25到2025-01-10,运行后会得到["12/2024", "1/2025"],完全符合预期。

如果需要月份显示为两位数(比如01/2025而不是1/2025),可以用补零的写法:

const monthSet = dateArray.map(i => `${String(i.getMonth() + 1).padStart(2, '0')}/${i.getFullYear()}`)

另外提一句,你的日期循环逻辑用UTC处理是很稳妥的,能避免很多时区相关的坑,这点做得很好。

内容的提问来源于stack exchange,提问作者Jowz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:15:23