我发现了一个小的Javascript函数,它可以比较日期并在某个日期在其他两个日期范围内时返回true
。它大部分工作正常,但由于某种原因,当比较日期等于结束日期时,它会返回false
。不过,它适用于开始日期,这就是为什么它让我感到困惑。有人看到我错过了什么吗?
var dates = {
convert:function(d) {
// Converts the date in d to a date-object.
return (
d.constructor === Date ? d :
d.constructor === Array ? new Date(d[0],d[1],d[2]) :
d.constructor === Number ? new Date(d) :
d.constructor === String ? new Date(d) :
typeof d === "object" ? new Date(d.year,d.month,d.date) :
NaN
);
},
inRange:function(d,start,end) {
// Checks if date in d is between dates in start and end.
return (
isFinite(d=this.convert(d).valueOf()) &&
isFinite(start=this.convert(start).valueOf()) &&
isFinite(end=this.convert(end).valueOf()) ?
start <= d && d <= end :
NaN
);
}
}
编辑:这是我的输入:我从数据库中获取测试数据,这是输出http://zoiglapp.bplaced.net/data/selectAll.php(抱歉,它看起来不是很漂亮,但重要字段是zoiglBegin
和zoiglEnd
(。如您所见,我有一个以 2015-11-09 结束的时间范围,另一个从那里开始。后者显示良好,前一个没有出现。这是我的 AngularJS 控制器,其中包含我找到的数据库数据、today
变量和比较函数:
app.controller('HomeController', ['$scope', '$http', function($scope, $http) {
$scope.today = new Date();
$http.get("data/selectAll.php")
.success(function(data) {
$scope.lokale = data;
});
$http.get("data/selectCities.php")
.success(function(data) {
$scope.cities = data;
});
$scope.dates = {
convert:function(d) {
// Converts the date in d to a date-object.
return (
d.constructor === Date ? d :
d.constructor === Array ? new Date(d[0],d[1],d[2]) :
d.constructor === Number ? new Date(d) :
d.constructor === String ? new Date(d) :
typeof d === "object" ? new Date(d.year,d.month,d.date) :
NaN
);
},
inRange:function(d,start,end) {
// Checks if date in d is between dates in start and end.
return (
isFinite(d=this.convert(d).valueOf()) &&
isFinite(start=this.convert(start).valueOf()) &&
isFinite(end=this.convert(end).valueOf()) ?
start <= d && d <= end :
NaN
);
}
};
}]);
这是我在 ngIf 指令中调用函数的地方:
<div ng-repeat="city in cities | orderBy:'city'">
<h2>{{city.city}}</h2>
<accordion close-others="true">
<accordion-group heading="{{lokal.name}}" ng-repeat="lokal in lokale | filter:city.city | orderBy:'name'" ng-if="dates.inRange(today, lokal.zoiglBegin, lokal.zoiglEnd)">
[...]
</div>
该程序非常正确,但是您传递的输入存在问题。您从服务中获得的输入只是日期,即d = "2015-11-11"
内部调用dates.convert(d)
调用将其转换为日期new Date(d)
因为您只传递日期,返回的Date
对象具有类似 Fri Dec 11 2015 00:00:00 GMT+0500 (PKT( 请注意输出中的时间,当您只传递日期字符串而不传递时间时。现在既然你今天分配喜欢
$scope.today = new Date(); //without the arguments.
你的结果将是类似于星期二十一月10 2015 09:44:12 GMT + 0500 (PKT(。注意这里的时间。因此,对构造函数Date();
调用会输出当前时间和日期。因此,当您将其与结束日期进行比较时,您可能会缺少时间,因为您可能会将 12:00AM 或只是 00:00 作为结束时间与 XX:XX AM/PM 或 XX:XX 进行比较,即时钟上的当前时间 XX:XX AM/PM大于 12:00AM 或 XX:XX 大于 00:00,因此在比较时返回false
。
您可以在我建议的后面的评论中尝试多个选项。
第一个选项
var x = new Date(); // This ass usual gives you the current date and time $scope.today = $scope.dates.convert([x.getFullYear(),x.getMonth(),x.getDate()]);
此处的调用仅将今天的日期作为数组传递给转换函数。
第二种选择更干净,:P
$scope.today = $scope.dates.convert((new Date()).toJSON().split("T")[0]);
此调用将简单地拆分返回的时间和日期,并将日期仅传递给
convert
呼叫,如convert("2015-11-10")
第三种选择与第二种非常相似。
$scope.today = new Date((new Date()).toJSON().split("T")[0]);
此选项可节省一定级别的呼叫和一些条件检查。 但恕我直言,有点脏。
总结
您可以通过使用提供的三个选项中的任何一个来利用您的目标 虽然我建议使用选项 2 或 3,因为两者都相似,但 3rd 在计算上是有效的。