使用moment.js处理31号日期时显示无效日期,年份差值为NaN
解决Moment.js解析31号日期导致无效日期的问题
你遇到的问题核心是Moment.js无指定格式解析日期时的歧义性。当你直接传入'31-8-2022'这种字符串时,Moment会依赖底层浏览器的Date对象来解析,很多浏览器会默认把这种格式识别为MM-DD-YYYY(月-日-年),但8月根本没有31号,自然就变成了无效日期,后续的diff计算也就返回NaN了。
解决方案:明确指定日期格式
直接在解析时告诉Moment你的日期格式是DD-MM-YYYY(日-月-年),就能强制按正确逻辑解析:
const selectedValue = moment('31-8-2022', 'DD-MM-YYYY'); const today = moment(); const yearDiff = today.diff(selectedValue, "year"); console.log(yearDiff);
额外优化:添加日期有效性校验
如果用户输入的日期可能不合法,建议加上isValid()方法做校验,避免后续逻辑出错:
const selectedDateStr = '31-8-2022'; const selectedValue = moment(selectedDateStr, 'DD-MM-YYYY'); if (selectedValue.isValid()) { const today = moment(); const yearDiff = today.diff(selectedValue, "year"); console.log(yearDiff); } else { console.log(`日期 ${selectedDateStr} 无效,请检查输入`); }
本质上,Moment.js的自动解析行为并不稳定,不同环境可能有差异,所以处理自定义格式的日期时,始终明确指定格式是最稳妥的做法。
内容的提问来源于stack exchange,提问作者Nilam
相关产品推荐
相关产品推荐

