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

设置en-GB locale后moment.js仍无法解析英国格式日期

问题原因及解决办法

你遇到的问题核心在于:Moment.js 设置 locale 主要影响的是日期的显示格式,而非默认解析逻辑。当你直接调用 moment('22/12/2019') 时,它不会自动套用 en-GB 对应的 DD/MM/YYYY 格式去解析,而是先尝试 ISO 8601 格式,失败后回退到浏览器自带的 Date.parse() 方法——而浏览器通常会把 / 分隔的日期默认按美式 MM/DD/YYYY 处理,22 作为月份显然无效,所以才会返回"无效日期"。美式格式能正常解析,只是刚好符合了浏览器的默认解析规则而已。

下面给你两种可行的解决思路:

1. 明确指定所有可能的输入格式

既然你提到日期会以多种格式传入,直接把所有支持的格式传给 Moment.js,让它逐一尝试匹配:

moment.locale('en-GB');
// 列出所有可能的输入格式,第三个参数true开启严格匹配,避免误解析
var d = moment('22/12/2019', ['DD/MM/YYYY', 'MM/DD/YYYY', 'DD/MM/YYYY HH:mm'], true);
alert(d.format()); // 此时会正确解析为2019-12-22

这种方式最直接,也能覆盖你提到的多种输入场景。

2. 利用 locale 的默认格式解析

如果你想让解析逻辑和当前 locale 绑定,可以先获取 en-GB 对应的默认日期格式,再传入解析方法:

moment.locale('en-GB');
// 获取当前locale的标准日期格式(en-GB的L格式是DD/MM/YYYY)
var localeDateFormat = moment.localeData().longDateFormat('L');
var d = moment('22/12/2019', localeDateFormat, true);
alert(d.format());

这种方式更贴合你设置全局locale的需求,后续如果切换locale,解析格式也会自动适配。

需要注意的是,开启严格匹配(第三个参数true)很重要,它能避免 Moment.js 把不符合格式的字符串强行解析成错误的日期,比如把13/12/2019当成MM/DD/YYYY解析成无效日期的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:15:48