我需要测试输入的日期格式是否正确。我想接受多种日期格式,因此我创建了一个验证函数来测试至少一种格式是否正确,在这种情况下返回 true。 我使用 moment.js 来测试日期。 当我简单地输入硬编码字符串日期格式的条件时,该函数可以正常工作:
var multiDateValidator = function (value)
{
if ((moment(value, 'DD/MM/YYYY', true).isValid()) ||
(moment(value, 'D/M/YYYY', true).isValid()) ||
(moment(value, 'DD.MM.YYYY', true).isValid()) ||
(moment(value, 'D.M.YYYY', true).isValid()) ||
(moment(value, 'DD. MM. YYYY', true).isValid()) ||
(moment(value, 'D. M. YYYY', true).isValid())) {
return true;
}
return false;
};
但是如果我想使用允许的日期格式列表,它不起作用,它永远不会返回 true。
var allowedDateFormats = ['DD/MM/YYYY', 'D/M/YYYY', 'DD.MM.YYYY', 'D.M.YYYY', 'DD. MM. YYYY', 'D. M. YYYY'];
var multiDateValidator = function (value)
{
allowedDateFormats.forEach(function(dateFormat)
{
if (moment(value, dateFormat, true).isValid()) {
return true;
}
});
return false;
};
第二个函数有什么问题?我知道我不太擅长 JavaScript,但它应该可以工作,不是吗?
无需使用
for
或 forEach
循环。 Moment 提供了 moment(String, String[], String, Boolean);
方法来使用多种格式解析字符串。
正如文档所说:
如果您不知道输入字符串的确切格式,但知道它可能是多种格式之一,则可以使用格式数组。
从版本2.3.0开始,Moment 使用一些简单的启发式方法来确定要使用哪种格式。按顺序:
- 优先选择导致有效日期的格式,而不是无效日期。
- 更喜欢解析更多字符串的格式而不是更少的格式,并且使用更多的格式而不是更少的格式,即更喜欢更严格的解析。
- 优先选择数组中较早的格式而不是较晚的格式。
这是一个实时工作示例:
var allowedDateFormats = ['DD/MM/YYYY', 'D/M/YYYY', 'DD.MM.YYYY', 'D.M.YYYY', 'DD. MM. YYYY', 'D. M. YYYY'];
var multiDateValidator = function (value){
return moment(value, allowedDateFormats, true).isValid();
};
var test = ['01/01/2017', '01.01.2017', '2017-Jan-01'];
for(var i=0; i<test.length; i++){
console.log(test[i], multiDateValidator(test[i]));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
正如我在评论中提到的,
return true
返回到内部函数,但它不会阻止外部函数执行,因此您的外部函数每次都会执行(即每次执行 return false 时)
我的解决方案是:
var allowedDateFormats = ['DD/MM/YYYY', 'D/M/YYYY', 'DD.MM.YYYY', 'D.M.YYYY', 'DD. MM. YYYY', 'D. M. YYYY'];
var multiDateValidator = function (value)
{
for(var dateFormat of allowedDateFormats) {
if (moment(value, dateFormat, true).isValid()) {
return true;
}
}
return false;
};
更现代的方法 -
const allowedDateFormats = [
"DD/MM/YYYY",
"D/M/YYYY",
"DD.MM.YYYY",
"D.M.YYYY",
"DD. MM. YYYY",
"D. M. YYYY",
];
const multiDateValidator = (dateStr) =>
allowedDateFormats.some((f) => moment(dateStr, f, true).isValid());