moment校验数字串时isValid返回true,如何仅识别ISO 8601格式日期
问题根因
代码的核心问题出在提前用new Date(attribute_value)对输入值做了强制解析:
new Date()对输入字符串的解析规则非常宽松,080921这类6位数字串会被它解析为合法的日期对象,不会返回无效日期- 当你把已经解析完成的Date对象传给
moment()时,moment.ISO_8601的格式校验和第三个参数的严格模式完全失效——Moment只会判断传入的Date本身是否合法,不会再校验原始输入是否符合ISO 8601格式,因此才会出现误判。
修正方案
直接把原始输入字符串传给Moment做严格格式校验即可,修改后的代码如下:
let modifiedValue = attribute_value; // 直接传入原始字符串、指定ISO_8601格式、开启严格模式 let isISOFormat = moment(attribute_value, moment.ISO_8601, true).isValid(); if (isISOFormat) { modifiedValue = formatDateShortCustom(moment(attribute_value).toDate()); } return modifiedValue; };
修改后只有严格符合ISO 8601格式的字符串才会返回true,080921这类非标准格式会被正确判定为false,不会触发后续格式化逻辑。
内容的提问来源于stack exchange,提问作者kunal kampassi
相关产品推荐
相关产品推荐

