我面临一个我无法解决的问题。 在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/
答案 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')
。