核心方法:getMonth 返回 0-11
JavaScript 获取当前月份用 Date 对象的 getMonth() 方法:
const now = new Date();
const month = now.getMonth(); // 0 表示一月,11 表示十二月
关键点:getMonth() 的返回值从 0 开始。一月的值是 0,十二月是 11。如果直接把结果当月份使用,所有月份都会差一位。取真实月份要加 1:
const month = new Date().getMonth() + 1; // 1-12
这是「js 获取当前月份」最常见的错误来源,写代码时优先考虑这一点。
需要两位数字时补零
接口参数、日期字符串、表单展示常要求 01 到 12 的格式。用 padStart 补零最简洁:
const month = String(new Date().getMonth() + 1).padStart(2, ‘0’);
不支持 padStart 的旧环境可以写成 ('0' + m).slice(-2),效果一致。
常见格式化场景
只要数字月份
const m = new Date().getMonth() + 1;
中文月份
const m = new Date().getMonth() + 1;
const cn = ${m}月; // “3月”
拼进 yyyy-MM 或 yyyy-MM-dd
const d = new Date();
const ym = ${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')};
用 toISOString().slice(0, 7) 也能得到 yyyy-MM,但它按 UTC 计算,在东八区凌晨时段可能比本地日期早一天甚至跨月,涉及月份边界时不建议使用。
取指定日期的月份
同一个方法适用于任意日期对象,不必局限于当前时间:
const monthOf = (dateStr) => new Date(dateStr).getMonth() + 1;
monthOf(‘2024-12-05’); // 12
注意 new Date('2024-12-05') 这类纯日期字符串按 UTC 解析,而 new Date(2024, 11, 5) 按本地时间构造。跨时区运行时,两者取到的月份在月末月初可能不同,需要统一构造方式。
时区与跨年的注意点
getMonth()取的是本地时区的月份;getUTCMonth()取 UTC 月份。服务端与客户端时区不一致时,同一时刻可能落在不同月份。- 十二月加 1 后是 12,不会溢出到 13,无需特殊处理;但如果做「上个月」这类计算,要自己处理
0回退到上一年的 12 月。
小结
获取当前月份只需一行 new Date().getMonth() + 1,重点在于记住基准是 0、按需补零、明确时区。把这三件事处理好,月份相关的取值和格式化基本不会出错。