Moment.js 中的错误?

Bug in Moment.js?

我遇到了一个我无法解决的问题。 在 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']) returns 我 29-02-2020。虽然我预计日期无效。这也适用于 2001 年、2002 年等。 从 2001 年到现在基本上每个 none 闰年。

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

我创建了一个小 fiddle 来演示这个问题: http://jsfiddle.net/r42jg/1183/

只是一个反思:我之前使用 moment.js 进行一般日期有效性检查,而且我还注意到它可以非常宽容。

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

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

这看起来是因为您将一组格式传递给了 moment。据我所知,moment 不支持接受格式数组,只支持格式字符串。

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')

我认为这不是错误。

来自文档:

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