如何根据当前时间在数组中查找即将发生的事件

How to find upcoming event in array based on current time

本文关键字:查找 事件 数组 何根 时间      更新时间:2023-09-26

我有一个事件数组,我想遍历该数组,并根据其开始时间与当前开始时间进行比较,找到下一个即将发生的事件。

基本上,说现在是下午3:30,有活动开始于下午12点,下午2点,下午4点,下午5点…我想要下午4点开始的活动。

样本数据:

    {
  "cache_time": 1470678992,
  "events": [
    {
      "title": "EVENT TITLE",
      "start_time": "12:00AM",
      "end_time": "12:00AM"
    },
    {
      "title": "EVENT TITLE",
      "start_time": "8:00AM",
      "end_time": "10:00AM"
    },
    {
      "title": "EVENT TITLE",
      "start_time": "10:00AM",
      "end_time": "12:00PM"
    },
    {
      "title": "EVENT TITLE",
      "start_time": "1:00PM",
      "end_time": "2:30PM"
    },
    {
      "title": "EVENT TITLE",
      "start_time": "2:30PM",
      "end_time": "3:00PM"
    },
    {
      "title": "EVENT TITLE",
      "start_time": "3:00PM",
      "end_time": "4:00PM"
    }
  ]
}
编辑:

到目前为止,我已经做了什么来获得当前会议,但当当前会议未知时,我很难获得下一次会议。

    var _this = this;
    var date = new Date();
    var currentHour = date.getHours();
    var currentMins = date.getMinutes();
    var reqStartTime = new Date();
    reqStartTime.setHours(currentHour, currentMins, 0);
    var reqEndTime = new Date(reqStartTime.getTime() + 2 * 60000);
    for (var e in EVENT_DATA.events) {
        var start_time  = EVENT_DATA.events[e].start_24time;
        var end_time    = EVENT_DATA.events[e].end_24time;
        var startTime = new Date();
        var endTime = new Date(); 
        startTime.setHours(start_time.substring(0,2), start_time.substring(3,5), 0);
        endTime.setHours(end_time.substring(0,2), end_time.substring(3,5), 0);
        if ( (reqEndTime > startTime && reqEndTime < endTime) || (reqStartTime > startTime && reqStartTime < endTime) ) {
            return EVENT_DATA.events[e];
        }
    }

因为您的start_time是一种非标准格式,我们需要做的一件事是将其转换为可用的值。我们将把它与start_date结合起来得到我们的比较值。

既然我们不能假设事件是有序的,我们也会考虑到这一点。

(function(data) {
  var currentTime = new Date();
  var getStartTime = function(event) { // This function converts the time into a usable format and returns it as a Date object
    try {
      return new Date(event.start_date + ' ' + event.start_time.replace(/(AM|PM)/, ' $1'));
    } catch(ex) { return null; }
  };
  var sortedEvents = jQuery(data.events).sort(function(a, b) {
    return getStartTime(a) > getStartTime(b) ? 1 : -1;
  }).toArray(); // Get an array of sorted events
  for (var i = 0; i < sortedEvents.length; i++) {
    if (getStartTime(sortedEvents[i]) < currentTime) { continue; }
    return sortedEvents[i]; // Starts now or after
  }
  return null; // No matches
})(sample_data);

问题的原始样本数据:

"events": [
    {
      "title": "EVENT TITLE",
      "start_time": "12:00AM",
      "end_time": "12:00AM",
      "start_24time": "00:00",
      "end_24time": "00:00",
      "start_date": "July 29, 2016",
      "end_date": "September 03, 2016",
      "display_date": "July 29 - September 03, 2016"
    }, ...
]