moment.js date validation from array of formats

问题

我需要测试正确日期格式的输入。 我想接受几种日期格式,所以我创建了一个验证函数来测试至少一种格式是否正常,在这种情况下返回 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,但它应该可以工作,不是吗?

回答1

不需要使用forforEach循环。 Moment 提供 moment(String, String[], String, Boolean); 使用多种格式解析字符串的方法。

正如文档所说:

如果您不知道输入字符串的确切格式,但知道它可能是众多格式之一,则可以使用格式数组。

2.3.0版本开始,Moment 使用一些简单的启发式方法来确定要使用的格式。 为了:

  • 更喜欢导致有效日期而不是无效日期的格式。
  • 更喜欢解析更多字符串而不是更少并且使用更多格式而不是更少的格式,即更喜欢更严格的解析。
  • 更喜欢数组中较早的格式而不是较晚的格式。

这是一个工作现场样本:

 var allowedDateFormats = ['DD/MM/YYYY', 'D/M/YYYY', 'DD.MM.YYYY', 'DMYYYY', 'DD. MM. YYYY', 'DM 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>
回答2

正如我在评论中提到的, 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;
};

更多相关内容:请点击查看