我需要测试输入的正确日期格式。我想接受几种日期格式,所以我创建了一个验证函数,测试是否至少有一种格式是正常的,在这种情况下返回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,但它应该有用,不应该吗?
答案 0 :(得分:2)
无需使用for
或forEach
循环。 Moment提供了moment(String, String[], String, Boolean);
方法,用于使用多种格式解析字符串。
正如文档所说:
如果你不知道输入字符串的确切格式,但知道它可能是众多格式之一,你可以使用一系列格式。
从版本 2.3.0 开始,Moment使用一些简单的启发式方法来确定要使用的格式。按顺序:
- 首选格式会导致valid日期超过无效日期。
- 首选格式解析更多的字符串而不是更少的格式,而不是使用更少的格式,即更喜欢更严格的解析。
- 首选阵列中较早的格式。
这是一个有效的实时样本:
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]));
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
&#13;
答案 1 :(得分:1)
正如我在评论中提到的,return true
返回内部函数,但它不会阻止外部函数执行,因此每次都会执行外部函数(即每次执行返回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;
};