moment.js 从格式数组进行日期验证

问题描述 投票:0回答:3

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

javascript momentjs
3个回答
9
投票

无需使用

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>


3
投票

正如我在评论中提到的,

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;
};

0
投票

更现代的方法 -

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());
© www.soinside.com 2019 - 2024. All rights reserved.