new Date().getMonth() 在一月返回 0,不是 1,这个坑每年都有人踩。
JS 的月份从 0 开始,0 是 1 月,11 是 12 月。所以 js获取当前月份 要加 1:const month = new Date().getMonth() + 1;。只写到这一步,9 月之前看着正常,10 月以后又可能少一位,拼接日期时就露馅。
补零和中文格式
要 2026-10 这种两位格式,用 String(month).padStart(2, '0'),ES2017 以后浏览器都支持。老项目没有 padStart,就写 month < 10 ? '0' + month : month。想要「十月」,用 new Intl.DateTimeFormat('zh-CN', { month: 'long' }).format(new Date()),不用自己维护月份数组。月份数组看着直观,跨年时下标容易错,Intl 省事。
时区比加减一更容易翻车
new Date() 取的是本机时间,服务器跑在 UTC 时,凌晨 0 点到 8 点之间取到的日期可能还是前一天。要按北京时间算,用 new Date(Date.now() + 8 * 3600 * 1000) 再取 getUTCMonth(),或者直接上 dayjs、Luxon 这类库处理时区。涉及签到、账单、统计报表,别拿客户端时间做判断依据。
还有个小地方,getMonth() 返回数字,toLocaleString 返回字符串,两者别混着比较。跨年算月份差,直接相减会得到负数,先把年份乘 12 再加上月份。补零只在展示时做,参与计算时保持数字类型。
一段能直接用的代码
const d = new Date(); const y = d.getFullYear(); const m = String(d.getMonth() + 1).padStart(2, '0'); const ym = y + '-' + m; 拼出来就是 2026-10。要取指定日期,把 new Date() 换成 new Date('2026-10-28'),再取同样的字段。注意 new Date('2026-10-28') 在部分老浏览器按 UTC 解析,日期可能差一天,带上时间的字符串更稳。
js获取当前月份 本身只有一行,真正麻烦的是补零、时区和格式。先想清楚这个月份给谁看、按哪个时区算,再决定是手写还是交给日期库。