在我的项目中,我必须在jquery(angular-jquery-datepicker)日期选择器中显示,该日期以正确的方式为用户在他/她的区域中格式化。 我能够以美国和欧盟格式展示。当用户设置这些日期时,我必须使用toISOString将其保存到数据库。但是,对于美国来说,没有任何问题可以解决。对于欧盟格式,我收到标题中发布的错误,我正在分享整个错误:
RangeError: Invalid time value
at Date.toISOString (<anonymous>)
at n.$scope.save (scripts.js:2826)
at angular.js:12474
at f (angular.js:21700)
at n.$eval (angular.js:14570)
at n.$apply (angular.js:14669)
at HTMLButtonElement.<anonymous> (angular.js:21705)
at HTMLButtonElement.dispatch (jquery.min.js:3)
at HTMLButtonElement.r.handle (jquery.min.js:3)
我不知道为什么美国约会有效,而欧盟却没有。我无法理解为什么一个日期工作但不适用于另一个日期。
下面我将分享给出该错误的代码:
$scope.save = function() {
if ($scope.banner.fromText != null && $scope.banner.toText != null) {
$scope.banner.from = new Date($scope.banner.fromText);
$scope.banner.to = new Date($scope.banner.toText);
$scope.banner.to.setHours(23, 59, 59)
$scope.banner.from = $scope.banner.from.toISOString()
$scope.banner.to = $scope.banner.to.toISOString()
}else{
$scope.banner.to = null
$scope.banner.from = null
}
我在代码$ filter('date')中使用(value.item.from,'shortDate');
但是,如果你需要看一些额外的东西来理解这个错误,请让我知道我应该发布什么来更好地了解它
我的日期选择器指令:
'use strict';
angular.module('angular-jquery-datepicker', []).factory('datepicker',
[function() {
return $.datepicker;
}]).provider('$datepicker', function() {
return {
setDefaults: function(language) {
$.datepicker.setDefaults($.datepicker.regional[language]);
},
$get: function() {
return {
}
}
}
}).directive('jqdatepicker', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, ctrl) {
element.datepicker({
//dateFormat: 'dd-mm-yy',
autoclose: true,
changeMonth: true,
changeYear: true,
maxDate: Date.today(),
showOn: "both",
buttonImage: "/img/calendar-o.png",
onSelect: function(date) {
ctrl.$setViewValue(date);
ctrl.$render();
scope.$apply();
}
});
}
};
/*Datepicker for banner - extended main datepicker*/
}).directive('jqdatepickerbanner', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, ctrl) {
//scope.customStartDate = today;
element.datepicker({
//dateFormat: 'dd-mm-yy',
changeMonth: true,
changeYear: true,
//maxDate: '+6mm', // 6 Months max date --> For set the maximum period the Banner can be set up
minDate: Date.today(),
showOn: "both",
buttonImage: "/img/calendar-o.png",
onSelect: function(date) {
if (this.id === "startDateBanner") {
$("#endDateBanner").datepicker("option", "minDate", date);
}
ctrl.$setViewValue(date);
ctrl.$render();
scope.$apply();
}
});
}
};
});
答案 0 :(得分:4)
事实证明,在toISOString
上调用Invalid Date
时会发生这种情况。这可能是因为您对new Date()
构造的输入是undefined
- 或 - 因为也许您正在操纵UTC-偏移到Invalid Date
。
这里有一个小片段,可以尽可能少地传达确切的错误:
clear();
;(function iif() {
var d = new Date(undefined); // .valueOf() === 'Invalid Date'
console.log('>', d, +d);
if (isNaN(+d)) return;
d.toISOString();
console.log('- executed -');
})();
将其丢入您的JS控制台并随意使用 - 您可以在toISOString
上调用new Date(undefined)
时随时重现该错误。 if (isNaN(+d)) return;
表示“如果UTC时间戳不是数字,只是中止任务” - +new Date()
与(new Date()).valueOf()
相同。
为您提供一点杠杆:确保您的虚假日期为null
或0
- 不是undefined
或""
(空字符串)。
希望这有帮助!