代码:
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;
};
在上面的代码中,属性值可以具有
2021-09-29T18:30:00.000Z
080921
我想确保当attribute_value为(1)格式时,代码modifiedValue = formatDateShortCustom(moment(attribute_value).toDate());
应该执行。
然而,这个数字字符串也导致isISOFormat
为true
,因此导航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>