我找到了一个比较日期的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>
答案 0 :(得分:0)
该程序非常正确,但您传递的输入存在问题。您从服务中获得的输入只是日期,即 d = "2015-11-11"
使用内部调用dates.convert(d)
的{{1}}调用将其转换为日期,因为您只传递日期返回的new Date(d)
对象的输出类似 2015年12月11日星期五00:00:00 GMT + 0500(PKT)注意输出中的时间,即只通过日期字符串,但不 时间。现在既然你今天要分配
Date
结果将是 2015年11月10日星期二09:44:12 GMT + 0500(PKT)。注意这里的时间。所以调用$scope.today = new Date(); //without the arguments.
构造函数会输出CURRENT TIME和DATE 。因此,当您将其与结束日期进行比较时,您可能会缩短时间,因为您可能会将 12:00 AM或仅仅00:00 与结束时间进行比较< strong> XX:XX AM / PM或XX:XX即时钟上的当前时间其中 XX:XX AM / PM大于12:00 AM或XX:XX大于00:00 < / strong>所以它在比较时返回Date();
。
您可以在我建议的后续评论中尝试使用多个选项。
第一个选项
false
此调用此处仅将今天的日期传递给转换函数作为数组。
第二个选项更清洁一个:P
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()]);
此通话只会将时间和日期分开,仅将日期传递给$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,因为两者都相似但第三是计算效率。