检查当前日期/时间是否与定义的时间段匹配

时间:2016-09-19 07:47:57

标签: html angularjs drop-down-menu timestamp

您好,我有以下代码:



angular.module("myApp", []).controller("myController", function($scope) {
  $scope.currentOption;

  $scope.setCurrentTimespan = function() {
    //CODE HERE
  };
  
  $scope.timespanList = [{
    id: 1,
    name: 'morning',
    startDate: '19.09.2016 06:00',
    endDate: '19.09.2016 11:59'
  }, {
    id: 2,
    name: 'noon',
    startDate: '19.09.2016 12:00',
    endDate: '19.09.2016 13:29'
  }, {
    id: 3,
    name: 'afternoon',
    startDate: '19.09.2016 13:30',
    endDate: '19.09.2016 18:29'
  }, {
    id: 4,
    name: 'evening',
    startDate: '19.09.2016 18:30',
    endDate: '19.09.2016 23:59'
  }, {
    id: 5,
    name: 'night',
    startDate: '20.09.2016 00:00',
    endDate: '20.09.2016 05:59'
  }];
});

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="myApp" ng-controller="myController">
  <select ng-options="option as option.name for option in timespanList" ng-model="currentOption"></select>
</div>
&#13;
&#13;
&#13;

我从后端获得了一个包含select项目的对象。在这个列表中有一些时间跨度,如早晨,中午,下午等。这个时间跨度有一个startDate和一个endDate,它也来自后端。例如,时间早晨&#34;按照startDate / endDate:[今天的日期] 06:00 / [今天的日期] 11:59。所以我想要做的是,当我加载列表并用select填充ng-options时,我想从列表中选择与当前时间戳匹配的项目。所以我必须得到当前的日期和时间,例如:19.09.2016 09:45然后在列表中搜索为此时间戳定义的项目并在列表中选择它。所以我必须用当前日期/时间检查startDate / endDate。这应该在加载列表时发生。

因此,我当地时间(19.09.2016 09:45)的结果将是早晨

有人知道怎么做吗?我没有找到任何可以帮助我的答案......谢谢

使用解决方案进行编辑:

我找到了解决这个问题的完美方法:我找到了moment.js,它解决了我的要求。将它包含到我的网络应用程序后,我开始使用moment.js中的查询和函数来解决我的问题。它的工作原理如下:

获取当前时间戳(日,月,年,小时和分钟):

let currentTimestamp = moment(); //for example 19.09.2016 11:30

比我使用timespans循环遍历我的数组并使用moment.js将startDate / endDate解析为我所需的format DD.MM.YYYY HH:mm然后我可以使用moment.js { {1}} query检查,如果我的currentTimestamp在每个项目的startDate / endDate之间,如下所示:

isBetween()

因此,如果循环项的条件为真,我可以在列表中设置正确的选项。以下是this.timespanList.forEach(function(item) { let startDate = moment(item.startDate, 'DD.MM.YYYY HH:mm'); // for example 19.09.2016 06:00 let endDate= moment(item.endDate, 'DD.MM.YYYY HH:mm'); // for example 19.09.2016 11:59 if(moment(currentTimestamp).isBetween(startDate, endDate)) { $scope.currentOption = item; } }); 的一些链接,描述了如何正确使用它 - 它真棒!

moment.js docs:http://momentjs.com/docs/

moment.js解析:http://momentjs.com/docs/#/parsing/

moment.js查询:http://momentjs.com/docs/#/query/

我希望这很有用!来自答案的替代解决方案也可以正常工作。谢谢和欢呼。

2 个答案:

答案 0 :(得分:1)

您可以实现自定义过滤器来实现此目的。

<select ng-options="option as option.name for option in timespanList | momentFilter" ng-model="currentOption"></select>

.filter('momentFilter',function(){
            return function (object) {
                var array = [];
                angular.forEach(object, function (time) {
                        if(time.startDate.split(" ")[1] == '06:00' && time.endDate.split(" ")[1] == '11:59'){
                          array.push(time);
                        }
                });
                return array;
            };
        });

我创建了一个工作的plunker here

要做更多努力才能实现这一目标。

答案 1 :(得分:0)

使用问题解决方案进行编辑:

我把自己的解决方案放在我编辑的问题中,这样每个人都可以更快地看到它:

我找到了解决这个问题的完美方法:我找到了moment.js,它解决了我的要求。将它包含到我的网络应用程序后,我开始使用moment.js中的查询和函数来解决我的问题。它的工作原理如下:

获取当前时间戳(日,月,年,小时和分钟):

let currentTimestamp = moment(); //for example 19.09.2016 11:30

比我使用timespans循环遍历我的数组并使用moment.js将startDate / endDate解析为我所需的格式DD.MM.YYYY HH:mm然后我可以使用moment.js查询isBetween()来检查,如果我的currentTimestamp在每个项目的startDate / endDate之间,如下所示:

this.timespanList.forEach(function(item) {
    let startDate = moment(item.startDate, 'DD.MM.YYYY HH:mm'); // for example 19.09.2016 06:00
    let endDate= moment(item.endDate, 'DD.MM.YYYY HH:mm'); // for example 19.09.2016 11:59

    if(moment(currentTimestamp).isBetween(startDate, endDate)) {
        $scope.currentOption = item;
    }
});

因此,如果循环项的条件为真,我可以在列表中设置正确的选项。这里有一些关于moment.js的链接描述,如何正确使用它 - 它真棒!

moment.js docs:http://momentjs.com/docs/

moment.js解析:http://momentjs.com/docs/#/parsing/

moment.js查询:http://momentjs.com/docs/#/query/

我希望这很有用!来自答案的替代解决方案也可以正常工作。谢谢和欢呼。