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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:30:52