日期范围比较不包括上次日期

时间:2015-11-09 11:37:13

标签: javascript date

我找到了一个比较日期的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 (对不起,它看起来不太漂亮,但重要的字段是zoiglBeginzoiglEnd)。正如你所看到的,我有一个时间范围在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>

1 个答案:

答案 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();

您可以在我建议的后续评论中尝试使用多个选项。

  1. 第一个选项

    false

    此调用此处仅将今天的日期传递给转换函数作为数组。

  2. 第二个选项更清洁一个: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")

  3. 第三种选择与第二种选择非常相似。

    $scope.today = new Date((new Date()).toJSON().split("T")[0]);
    

    此选项可以保存一个级别的呼叫和一些条件检查。但有点肮脏恕我直言。

  4. 摘要

    您可以通过使用提供的三个选项中的任何一个来利用您的目标。虽然我建议使用选项2或3,因为两者都相似但第三是计算效率。