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')
。
我认为这不是错误。
来自文档:
- 比无效日期更喜欢产生有效日期的格式。
http://momentjs.com/docs/#/parsing/
所以第一种格式 'DD-MM-YY' 产生了一个有效的日期。
我遇到了一个我无法解决的问题。 在 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')
。
我认为这不是错误。
来自文档:
- 比无效日期更喜欢产生有效日期的格式。 http://momentjs.com/docs/#/parsing/
所以第一种格式 'DD-MM-YY' 产生了一个有效的日期。