当输入为整数时,moment().isValid返回true



代码:

let modifiedValue = attribute_value;
let isISOFormat = moment(new Date(attribute_value), moment.ISO_8601, true).isValid();
if (isISOFormat) {
modifiedValue = formatDateShortCustom(moment(attribute_value).toDate());
}
return modifiedValue;
};

在上面的代码中,属性值可以具有

  1. 2021-09-29T18:30:00.000Z
  2. 080921

我想确保当attribute_value为(1)格式时,代码
modifiedValue = formatDateShortCustom(moment(attribute_value).toDate());应该执行。

然而,这个数字字符串也导致isISOFormattrue,因此导航formatDateShortCustom方法,这是我不想要的吗?

我做错了什么吗?

我建议将其封装在函数isISOFormat()中,并使用它来决定您的输入是否是ISO 8601日期字符串。

我还建议将输入直接传递给moment()构造函数,而不是先创建Date:

let attribute_values = ['2021-09-28T11:45:00Z', new Date().toISOString(), 20, null, '28/09/2021', 'is this a date?'];
function testIsISOFormat() {
for(let attribute_value of attribute_values) {
console.log(`isISOFormat(${attribute_value}):`, isISOFormat(attribute_value));
}
}
function isISOFormat(input) {
return moment(input, moment.ISO_8601, true).isValid();
}
console.log('Testing isISOFormat:');
testIsISOFormat()
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

moment.ISO_8601是版本2.7.0以下的undefined

这就是为什么moment尝试解析该值,而不管您设置了严格的解析选项。moment检查字符串是否与已知的ISO 8601格式匹配。

我建议将该格式作为第二个参数明确传递。

console.log(moment('2021-09-29T18:30:00.000Z', 'YYYY-MM-DDTHH:mm:ss.SSSZ', true).isValid());
console.log(moment('080921', 'YYYY-MM-DDTHH:mm:ss.SSSZ', true).isValid());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

相关内容

  • 没有找到相关文章

最新更新