moment.js格式数组的日期验证

时间:2017-06-16 09:31:18

标签: javascript momentjs

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

2 个答案:

答案 0 :(得分:2)

无需使用forforEach循环。 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;
&#13;
&#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;
};