moment.js第二个参数失效求助:日期验证及格式转换报错
解决Moment.js解析日期返回false的问题
我来帮你排查这个问题,你遇到的moment().isValid()返回false,大概率是区域设置不匹配或者格式细节的小问题,我们一步步来分析:
1. 最可能的原因:区域(Locale)不兼容
Moment.js的日期解析依赖于当前设置的区域,如果你项目里全局设置了非英文的区域(比如中文zh-cn),那它就无法识别Fri(英文星期缩写)和Jan(英文月份缩写),自然会返回无效日期。
解决办法:
- 解析时明确指定英文区域:
moment('Fri 5 Jan, 2018 - 05:00 PM', 'ddd d MMM, YYYY - hh:mm A', 'en').isValid() - 或者全局设置英文区域(如果你的项目主要用英文日期格式):
moment.locale('en');
2. 用严格模式定位具体错误
Moment默认是宽松解析,有时候会掩盖格式不匹配的细节。你可以开启严格模式(第三个参数传true),再用invalidAt()方法查看哪一部分解析失败了:
const dateMoment = moment('Fri 5 Jan, 2018 - 05:00 PM', 'ddd d MMM, YYYY - hh:mm A', true); console.log(dateMoment.isValid()); // 依然会返回false,但我们能找到原因 console.log(dateMoment.invalidAt()); // 返回错误的位置索引: // 0 = 星期部分(Fri),1 = 日期(5),2 = 月份(Jan),3 = 年份(2018),4 = 时间部分
如果返回0或2,那基本就是区域的问题;如果返回其他值,再检查对应部分的格式是否完全匹配(比如空格、标点符号)。
3. 检查格式字符串和输入的完全匹配
虽然你说和Datetimepicker的格式一致,但还是要仔细核对每一个字符:
- 输入里的逗号、空格、横杠
-的位置要和格式字符串完全对应,比如Jan, 2018后面的空格不能少,格式里的MMM, YYYY是逗号加空格,输入也要一样。 - 时间部分的
hh是12小时制的两位数字,你的05是对的;A对应PM也没问题。
4. 排除隐藏字符问题
有时候复制粘贴的日期字符串可能带有不可见的特殊字符(比如全角空格、零宽空格),导致解析失败。你可以把输入字符串转成ASCII码检查,或者手动重新输入一遍测试:
// 查看字符串的每个字符编码,确认没有异常 Array.from('Fri 5 Jan, 2018 - 05:00 PM').forEach(c => console.log(c.charCodeAt(0)));
按照上面的步骤排查,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者Yash Mittal
相关产品推荐
相关产品推荐

