Intl.DateTimeFormat返回错误月份名:三月重复出现问题求助
为什么Intl.DateTimeFormat会重复返回三月?
嘿,这个问题其实是日期溢出导致的自动滚动搞的鬼,我来给你理清楚:
问题根源
JavaScript的Date.setMonth()方法有个容易被忽略的特性:如果当前日期的「日数」大于目标月份的最大天数,日期会自动往后滚动到下一个月的对应天数。举个具体例子:
- 假设你的初始
date是1月31日(很多人测试时的当前日期可能刚好是月底) - 当你执行
date.setMonth(1)(设置为二月)时,二月最多只有28或29天,不存在31号 - 这时候JS会自动把日期调整为3月3日(28天的话,31-28=3,直接跳到三月)
- 用
Intl.DateTimeFormat格式化这个日期,自然会返回"March"
再看你的循环逻辑:
- 当
month=1时,实际格式化的是三月的日期,输出「2 March」 - 接着
month增加到2,执行date.setMonth(2)(设置为三月),此时日期是3月31日(没问题),格式化还是"March" - 于是就出现了两次"March"的重复输出
验证方法
你可以把初始日期改成当月的1号,比如:
let date = new Date(2024, 0, 1); // 固定为1月1日
再运行代码,就不会有重复的月份了——因为每个月份的1号都是合法存在的,不会触发日期滚动。
修复方案(如果你想继续用Intl)
只要在初始化时把日期设为当月1号,就能彻底避免溢出问题:
let date = new Date(); date.setDate(1); // 强制把日期设为1号,避免溢出 let month = date.getMonth(); let options = { month: "long" }; for (let i = 0; i < 12; i++) { if (month === 12) { month = 0; } date.setMonth(month); let monthName = new Intl.DateTimeFormat("en-US", options).format(date); console.log((month + 1) + " " + monthName); month++; }
当然你用数组存储月份名称的方案也完全可行,只是这个Intl的问题确实不是你的代码逻辑错误,而是JS日期对象的特性导致的~
内容的提问来源于stack exchange,提问作者greger breger
相关产品推荐
相关产品推荐

