我通过angularJS的GET请求从Laravel导入数据。结果:
"vacations":[
{
"id":1,
"timeschedule_id":1,
"begindate":"2017-04-28 00:00:00",
"enddate":"2017-04-30 00:00:00",
},
{
"id":2,
"timeschedule_id":1,
"begindate":"2017-05-05 00:00:00",
"enddate":"2017-05-06 00:00:00",
}
]
请注意,此假期JSON数组位于数据 JSON数组
内现在我已经制作了以下过滤器来检查来自getDate()的日期是否在我的控制器中的begindate和enddate之间:
$scope.vacation = data.data[0].vacations.filter(function (d) {
if(moment(d.begindate).format("DD-MM-YYYY") <= $scope.getDate(4)
&& $scope.getDate(4) <= moment(d.enddate).format("DD-MM-YYYY")) {
return true;
}
});
getDate()函数是一个简单的函数,仅此而已:
$scope.getDate = function($days_forward) {
return moment().add($days_forward + $scope.i, 'days').format("DD-MM-YYYY");
};
此过滤器返回正确的结果,但结果也超出了要求。例如,这条线也正在通过,但它不应该:
28-05-2017 // Result from getDate()
如何确保仅从我的过滤器中返回2017-04-28 00:00:00
- 2017-04-30 00:00:00
和2017-05-05 00:00:00
- 2017-05-06 00:00:00
之间的日期?
答案 0 :(得分:1)
您只需使用isBetween
即可。您的代码可能如下所示:
$scope.vacation = data.data[0].vacations.filter(function (d) {
if( $scope.getDate(4).isBetween(d.begindate, d.enddate) ) {
return true;
}
});
$scope.getDate = function($days_forward) {
return moment().startOf('day').add($days_forward + $scope.i, 'days');
}
getDate
函数现在返回一个时刻对象而不是一个字符串。
如果您需要,可以自定义包容性:
版本 2.13.0 引入了包容性。
[
表示包含值。(
表示排除。如果使用包含性参数,则必须通过两个指标。如果未指定包含性参数,则Moment将默认为
()
。
作为一般规则,如评论中所述,请使用isSame
,isAfter
,isBefore
之类的时间query函数来比较时刻对象,而不是将它们格式化为字符串并通过<=
答案 1 :(得分:1)
我正在将字符串与momentJS对象进行比较,因此我执行了以下步骤来解决此问题:
将过滤条件更改为:
if($scope.getMomentDate(4).isBetween(moment(d.begindate), moment(d.enddate),
'days', '[]')) { // [] = all inclusive
return true;
}
制作辅助函数getMomentDate()而不是getDate()
$scope.getMomentDate = function($days_forward){
return moment().add($days_forward + $scope.i, 'days');
};
isBetween 方法可用于比较两个MomentJS对象。使用此方法的可选第四个参数,我能够在给定范围内包含每个MomentJS对象。