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



我发现了一个小的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>

该程序非常正确,但是您传递的输入存在问题。您从服务中获得的输入只是日期,即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

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

  1. 第一个选项

    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()]);
    

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

  2. 第二种选择更干净,:P

    $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]);
    

    此选项可节省一定级别的呼叫和一些条件检查。 但恕我直言,有点脏。

总结

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

最新更新