使用moment.js的日期验证在给出无效日期时没有给出错误

时间:2017-02-09 06:49:23

标签: javascript angularjs validation momentjs

我正在使用角度js进行验证。对于日期验证,我使用的是moment.js文件。我的问题是当我输入年份为'0000'的日期时,例如1-1-0000,它没有给出错误。我的指令代码如下 -

app.directive("validDate", function () {
  return {
    require: "ngModel",
    restrict: "A", // Attributes only
    link: function (scope, elem, attr, ctrl) {
        ctrl.$validators.cValidDate = function(value) {
            if (value === undefined || value === null || value === "") {
                return true;
            }

            return moment(value, ["D-M-YYYY"], true).isValid();
        }
    }
}
});

有人可以帮我验证吗?我在这里创造了一个掠夺者 - PLUNKER

我编辑了剧本, 但是现在它仍然给出了低于1-1-1970的所有日期的错误,因为它的日期1-1-0001为1-1-1970所以根据它进行验证, 当日期没有值时,日期显示为无效,直到我输入的日期大于1-1-1970。 我希望如果年份是0000日期不应该有效。有谁能够帮我?我用上面的代码更新了我的plunker。

更新 -

现在我能够解决日期问题,但我现在的问题是 -  如果日期为空仍然是错误,那么当日期为空时我不想要这个错误,我应该为此放置什么条件?请参阅我更新的plunker。

答案 -

我能够回答,因为我添加了以下条件 -

    if(moment(value, ["D-M-YYYY"], true).isValid()){ 
               // condition
} else 
    return true;

在此处查看我的新手 - https://plnkr.co/edit/uKcynQktBCKRYoN7xdM1?p=preview

2 个答案:

答案 0 :(得分:1)

Native JS Date对象认为也有一年零。每年ISO 8601可以接受零年,它使用天文年编号。在该系统中,年0 = 1 BCE,年-1 = 2 BCE,等等。

许多数据库都不是这样。因此,更好地设置日期必须大于您需要的主题中的验证。

if(moment(value, ["D-M-YYYY"], true).isValid())
            {

              //alert(moment(value, ["D-M-YYYY"], true).isSameOrAfter(moment("1-1-0001"), ["D-M-YYYY"], true));
              if(moment(value, ["D-M-YYYY"]).isSameOrAfter(moment("1-1-0000"), ["D-M-YYYY"]) )
                return true ;
              else
                return false;
            }else
            {
              return false;
            }

答案 1 :(得分:0)

您可能想要添加一个仅检查年份值的函数。我的解决方案并不优雅,但它可以解决问题。

function checkYear (v) {
  v = v.split("-");
  if(v[2] === "0000"){
    return true;
  }
  /* or you could go for a year of your choice*/
  /*
  if(parseInt(v[2]) <= 1900){
    return true;
  }
  */
}