设置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
相关产品推荐
相关产品推荐

