Moment.js中的错误?

时间:2015-12-09 09:45:56

标签: angularjs momentjs

我面临一个我无法解决的问题。 在AngularJS中,我创建了一个检查日期有效性的指令。为此,我使用Moment.js

这是我的指示:

/* @ngInject */
function modelDate() {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            var validate = function (value) {
                if (!value) {
                    // don't validate an undefined value. required or ng-required should handle that
                    ngModel.$setValidity('date', true);
                    ngModel.$setValidity('maxDate', true);
                    ngModel.$setValidity('minDate', true);
                    return value;
                }

                var date = moment(value, ['DD-MM-YY', 'DD-MM-YYYY', 'DD-MM']);
                if (!date.isValid()) {
                    // invalid date, so no validity check on max and min date
                    ngModel.$setValidity('date', false);
                    ngModel.$setValidity('maxDate', true);
                    ngModel.$setValidity('minDate', true);
                    return value;
                } else {
                    ngModel.$setValidity('date', true);
                }

                if (ngModel.$viewValue !== date.format('DD-MM-YYYY')) {
                    // format and set value
                    value = date.format('DD-MM-YYYY');
                    element.val(value);
                }

                return value;
            };

            ngModel.$parsers.push(validate); // for DOM -> model validation
            ngModel.$formatters.push(validate); // for model -> DOM validation
        }
    };

我的问题如下:

当我输入日期29-02-2015时,moment(value, ['DD-MM-YY', 'DD-MM-YYYY', 'DD-MM'])会返回29-02-2020。虽然我期待一个无效的日期。这也是2001年,2002年等。 从2001年到现在,基本上每一年都没有闰年。

之前有人遇到过这个问题吗?

我创造了一个小小的小提琴来证明这个问题: http://jsfiddle.net/r42jg/1183/

3 个答案:

答案 0 :(得分:1)

只是一个反思:我曾经使用moment.js进行一般日期有效性检查,我也注意到它可能非常宽容。

我所做的是将输入与结果进行比较;如果它们不匹配,则日期无效。

当然,假设输入日期的格式是已知的。

答案 1 :(得分:1)

我认为这不是一个错误。

来自文档:

所以第一种格式' DD-MM-YY'产生有效的日期。

答案 2 :(得分:-1)

这看起来是由于你传递了一系列格式。据我所知,时刻不支持接受格式数组,只支持格式字符串。

请参阅http://momentjs.com/docs/#/parsing/string-format/

如果您将格式更改为字符串,那么您将获得预期的行为:http://jsfiddle.net/wc9bstux/

所以更改:moment(value, ['DD-MM-YY', 'DD-MM-YYYY', 'DD-MM'])moment(value,'DD-MM-YYYY')