详细讲解在 JavaScript 中获取当前月份中文全称(如“一月”、“二月”直至“十二月”)的两种核心实现方案:Intl.DateTimeFormat 原生国际化 API 与静态数组查表法,涵盖底层索引原理、多端环境选型与防错指南。
JS怎么获取当前月的中文名称(如“一月”)
时间:2026-11-03
浏览:158
文章目录
Intl.DateTimeFormat 国际化接口;二是使用静态数组结合 Date.prototype.getMonth() 进行索引查表映射。本文将详细讲解这两种方案的具体语法、执行步骤、底层索引机制以及多端选型注意事项,帮助你在项目中准确实现目标。
一、快速上手:两种主流实现方案
在实际业务开发中,将当前时间格式化为中文月份通常只需 1 到 2 行代码。根据对外部运行环境(如浏览器语言包、Node.js 运行时配置)的依赖程度,可分别选择原生国际化 API 或纯静态查表法。
方案 1:使用原生国际化 API(Intl.DateTimeFormat)
ECMAScript 国际化 API 规范(ECMA-402)为 JavaScript 提供了内置的多语言日期解析能力。通过指定 zh-CN 语言标签与 month: 'long' 参数,可以由系统底层直接输出标准的中文月份全称。
// 语法:使用 Intl.DateTimeFormat 格式化当前日期
const formatter = new Intl.DateTimeFormat('zh-CN', { month: 'long' });
const currentMonthName = formatter.format(new Date());
console.log(currentMonthName);
"一月";若处于 12 月份,将输出 "十二月"。
如果代码仅作单次调用,也可以直接借助 Date.prototype.toLocaleString() 方法简写:
// 简写调用方式
const currentMonthName = new Date().toLocaleString('zh-CN', { month: 'long' });
方案 2:使用静态数组映射(查表法)
数组查表法属于纯粹的 JavaScript 基础语法实现。首先声明一个包含 12 个中文月份的常量数组,再通过当前日期对象的 getMonth() 方法获取月份索引,直接取得对应位置的字符串。
// 声明标准中文月份映射表(索引 0 至 11)
const CHINESE_MONTHS = [
'一月', '二月', '三月', '四月',
'五月', '六月', '七月', '八月',
'九月', '十月', '十一月', '十二月'
];
// 提取当前月份并完成查表
const monthIndex = new Date().getMonth();
const currentMonthName = CHINESE_MONTHS[monthIndex];
console.log(currentMonthName);
monthIndex 为数值 2,查表输出 "三月"。
二、底层机制:为什么直接加法拼接不可行?
初学者在面对此类需求时,常容易产生一种直觉思路:先调用 date.getMonth() + 1 得到月份数字,再直接拼上汉字 "月"。然而,这种做法无法得到标题所要求的中文全称。
1. 阿拉伯数字与中文数词的区别
直接将数值加 1 并拼接字符串,输出的结果是 "1月"、"2月"、"10月"。虽然在日常交流中可以看懂,但它属于“阿拉伯数字 + 中文后缀”,并非标准的中文汉字数词(如“一月”、“十月”)。
如果要通过代码将阿拉伯数字转换为中文汉字,需要专门处理位权逻辑(个位、十位、十几的双字发音等)。这不仅增加了不必要的算法复杂度,也容易在十月、十一月产生边界漏洞。
2. 0 索引规范与数组下标的天然契合
ECMAScript 规范沿用了早期 C 语言及 Java java.util.Date 的设计:Date.prototype.getMonth() 返回的是一个处于 0 到 11 之间的整数,其中 0 代表 1 月,11 代表 12 月。
虽然这一设计常在计算公历月份数字时引发“忘记加 1”的 Bug,但在中文名称查表映射的场景下,它反而是最完美的匹配——因为 JavaScript 数组的起始下标也是 0。我们无需做任何偏移转换,CHINESE_MONTHS[date.getMonth()] 即可直接、精准命中对应的中文名称。
三、进阶配置与选型决策
在实际项目架构中,应该在 Intl.DateTimeFormat 与 静态查表法 之间如何做出取舍?我们可以从参数控制、多语言扩展以及执行环境差异三个维度来考量。
1. Intl 参数的精细化控制
Intl.DateTimeFormat 的优势在于高度的规范化与标准库集成。它的配置项对象除了 month: 'long' 外,还支持以下常用选项:
month: 'long':输出完整中文月份全称,如"一月"、"十二月"。month: 'short':根据本地化规范缩写,在中文语境下通常输出"1月"、"12月"。month: 'narrow':极简样式,通常只输出数字"1"、"12"。
// 参数效果对比
const d = new Date();
console.log(new Intl.DateTimeFormat('zh-CN', { month: 'long' }).format(d)); // 示例输出: "一月"
console.log(new Intl.DateTimeFormat('zh-CN', { month: 'short' }).format(d)); // 示例输出: "1月"
console.log(new Intl.DateTimeFormat('zh-CN', { month: 'narrow' }).format(d)); // 示例输出: "1"
2. 静态数组的不可替代性:定制化与极端环境
如果项目有特殊排版需求,例如传统农历风格的“正月”、“冬月”、“腊月”,或者报表系统的特殊缩写,Intl 提供的公历标准词表可能无法满足定制需求。此时静态数组可以按需自由声明:
// 自由定制月份称谓
const TRADITIONAL_MONTHS = [
'正月', '二月', '三月', '四月',
'五月', '六月', '七月', '八月',
'九月', '十月', '冬月', '腊月'
];
| 对比指标 | 方案 A: Intl.DateTimeFormat | 方案 B: 静态数组查表法 |
|---|---|---|
| 规范标准 | ECMAScript 国际化标准 (ECMA-402) | 原生 Array 索引取值 |
| 运行性能 | 多次实例化有微小初始化开销 (建议模块级复用) | 寻址仅耗时 O(1),极端高效 |
| 定制灵活性 | 受 Unicode CLDR 规范限制,不可篡改 | 100% 自由定义(如“正月/腊月”) |
| 运行时稳定性 | 需依赖宿主环境包含中文 ICU 数据 | 无任何外部依赖,100% 跨平台稳定 |
| 推荐场景 | 前端国际化网站、多语言动态切换系统 | 轻量业务、Node.js 容器镜像、高吞吐接口 |
四、工程落地与避坑指南
在真实团队开发中,时间的获取往往伴随着跨端构建、时区偏移与运行环境差异。以下三项是上线前必须确认的关键检查点。
1. Node.js 瘦容器中的 ICU 缺失陷阱
在现代容器化部署中,许多团队会使用 Alpine Linux 或精简版的 Node.js Docker 镜像(例如 node:alpine)。为了缩减体积,这些瘦镜像有时默认未打包完整 ICU 数据(full-icu)或仅包含英文数据。
new Intl.DateTimeFormat('zh-CN', { month: 'long' }) 时并不会抛出语法错误,而是会静默降级为英文默认格式(输出 "January")。如果在 Node.js 后端开发此类功能,建议优先使用静态数组查表法,或者确保安装并启用了 full-icu 支持。
2. 服务端渲染(SSR)的时区一致性
new Date() 会根据运行宿主的系统时区解析当前时间。如果生产服务器配置在 UTC+0 时区(例如海外云节点),而在北京时间(UTC+8)每逢月末的夜间 00:00 至 07:59 时段执行计算,两者解析出的月份会产生 1 个月的差异。
如果在 SSR 或服务端生成中文报表,建议通过 Intl 明确锁定目标时区:
// 在服务端显式指定时区,规避服务器本地时间偏差
const bjMonth = new Intl.DateTimeFormat('zh-CN', {
timeZone: 'Asia/Shanghai',
month: 'long'
}).format(new Date());
3. 标准工业级工具函数封装
为了防止各个业务组件中重复书写代码,推荐在工程的 dateUtils 模块中提供统一的纯函数封装,并附带类型保障与非法参数熔断机制:
/**
* 获取指定日期(默认当前时间)的中文月份全称
* @param {Date} [date=new Date()] 目标时间实例
* @returns {string} 中文月份名称,如 "一月"
*/
export function getCurrentChineseMonth(date = new Date()) {
// 基础防御:确保传入对象为合法 Date
if (!(date instanceof Date) || isNaN(date.getTime())) {
date = new Date();
}
const months = [
'一月', '二月', '三月', '四月',
'五月', '六月', '七月', '八月',
'九月', '十月', '十一月', '十二月'
];
return months[date.getMonth()] ?? '';
}
五、总结
在 JavaScript 中获取当前月份的中文名称,核心要点可概括为以下三项:
- 标准规范推荐:在浏览器端及具备完整多语言支持的环境中,首选
new Intl.DateTimeFormat('zh-CN', { month: 'long' }).format(new Date()),符合 ECMAScript 国际化规范。 - 性能与稳定性推荐:在对执行速度要求极高、需要特殊称谓定制或在微型 Node.js 容器中运行时,使用预定义的 12 元素静态数组进行查表是零风险、零外部依赖的最稳妥方案。
- 牢记索引规则:
Date.prototype.getMonth()始终返回0~11,直接作为数组下标可天然对应“一月”至“十二月”,切勿随意混用加法拼接。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。