确定公交车出发前的剩余时间

时间:2018-11-14 21:21:57

标签: javascript date time

对于我们的数字标牌系统,我想显示下一辆公交车要离开多久。我建立了一个始终保持有效的数组,并成功地(可能不是很优雅或没有效率)对其进行了更改,以显示直到列出的每个出发点还剩下多少时间(正数或负数)。

关于如何根据当前时间确定下一条公交车,我需要向正确的方向轻推。如果7分钟内有公交车,我只需要显示那一辆,而无需显示20分钟内下一辆公共汽车。

我在想也许是 for循环,它查看剩余时间的数组,并在第一次达到正值时停止。我担心这可能会引起我没有考虑的问题。

任何帮助将不胜感激。

更新:不幸的是,提供的所有解决方案都在我们的标牌系统上引发错误。我怀疑它运行的是Javascript的某些受限版本,但是那超出了我。但是,不同的解决方案对让我想到另一种方法非常有帮助。我想我终于来了,因为这似乎行得通。我将让它在假期中运行,并在星期一进行检查。再次感谢!

var shuttleOrange = ["09:01", "09:37", "10:03", "10:29", "10:55", "11:21", "11:47", "12:13", "12:39", "13:05", "13:31", "13:57", "14:23", "14:49", "15:25", "15:51", "16:17", "16:57", "17:37", "18:17"];

var hFirst = shuttleOrange[0].slice(0,2);
var mFirst = shuttleOrange[0].slice(3,5);
var hLast = shuttleOrange[shuttleOrange.length-1].slice(0,2);
var mLast = shuttleOrange[shuttleOrange.length-1].slice(3,5);

var theTime = new Date();
var runFirst = new Date();
var runLast = new Date();

runFirst.setHours(hFirst,mFirst,0);
runLast.setHours(hLast,mLast,0);


if ((runFirst - theTime) >= (30*60*1000)) {
return "The first Orange Shuttle will depart PCN at " + shuttleOrange[0] + "."
} else if (theTime >= runLast) {
return "Orange Shuttle Service has ended for the day."
} else {


for(var i=0, l=shuttleOrange.length; i<l; i++)
{
var h = shuttleOrange[i].slice(0,2);
var m = shuttleOrange[i].slice(3,5); 
var departPCN = new Date();

departPCN.setHours(h,m,0);
shuttleOrange[i] = departPCN;
}


for(var i=shuttleOrange.length-1; i--;)
{

//var theTime = new Date();


if (shuttleOrange[i] < theTime) shuttleOrange.splice(i,1)
}


var timeRem = Math.floor((shuttleOrange[0] - theTime)/1000/60);


if (timeRem >= 2) {
return "Departing in " + timeRem + " minutes."
} else if (timeRem > 0 && timeRem < 2) {
return "Departing in " + timeRem + " minute."
} else {

return "Departing now."
}
}

2 个答案:

答案 0 :(得分:0)

我在正确的时间之后将filter用于所有穿梭的航天飞机,并计算出第一个航天飞机还剩下多少时间。

var shuttleOrange = ["09:01", "09:37", "10:03", "10:29", "10:55", "11:21", "11:47", "12:13", "12:39", "13:05", "13:31", "13:57", "14:23", "14:49", "15:25", "15:51", "16:17", "16:57", "17:37", "18:17"];

var d = new Date();
var h = d.getHours();
var m = d.getMinutes();

var remainShuttle = shuttleOrange.filter(bus => bus.substring(0,2) > h || (bus.substring(0,2) == h && bus.substring(3,5) > m));

var leftMinutes = (parseInt(remainShuttle[0].substring(0,2))*60 + parseInt(remainShuttle[0].substring(3,5))  - (parseInt(h) *60 + parseInt(m)));

console.log(parseInt(leftMinutes / 60) + " hours and " + leftMinutes % 60 +" minutes left for next shuttle");

答案 1 :(得分:0)

您只需搜索一次即可找到下一个预定时间的索引。然后,随着时间的流逝,增加索引以获取下一次。一旦到达阵列的末尾,请重新开始。

下面是一个示例,大多数代码是设置程序和帮助程序。它从5分钟前开始每两分钟创建一个虚拟日程表,然后更新消息。当然,您可以得到更复杂的信息,例如在最后几分钟之内显示警告,等等。但这显示了总体思路。

window.addEventListener('DOMContentLoaded', function() {

  // Return time formatted as HH:mm
  function getHHmm(d) {
    return `${('0'+d.getHours()).slice(-2)}:${('0'+d.getMinutes()).slice(-2)}`;
  }

  var sched = ["09:01", "09:37", "10:03", "10:29", "10:55", "11:21", "11:47",
                "12:13", "12:39", "13:05", "13:31", "13:57", "14:23", "14:49",
                "15:25", "15:51", "16:17", "16:57", "17:37", "18:17","21:09"];
  var msg   = '';
  var msgEl = document.getElementById('alertInfo');
  var time  = getHHmm(new Date());
  var index = 0;
  
  // Set index to next scheduled time, stop if reach end of schedule
  while (time.localeCompare(sched[index]) > 0 && index < sched.length) {
    ++index;
  }
  
  function showNextBus(){
    var time = getHHmm(new Date());
    var schedTime;
    
    // If run out of times, next scheduled time must be the first one tomorrow
    if (index == sched.length && time.localeCompare(sched[index - 1]) > 0) {
      msg = `Current time: ${time} - Next bus: ${sched[0]} tomorrow`;
    
    // Otherwise, show next scheduled time today
    } else {
      // Fix index if rolled over a day
      index = index % sched.length;
      schedTime = sched[index];
      msg = `Current time: ${time} - Next bus: ${schedTime}`;
      
      if (schedTime == time) msg += ' DEPARTING!!';
      
      // Increment index if gone past this scheduled time
      index += time.localeCompare(schedTime) > 0? 1 : 0;
    }
    
    msgEl.textContent = msg;
  
    // Update message each second
    // The could be smarter, using setInterval to schedule running at say 95%
    // of the time to the next sched time, but never more than twice a second
    setInterval(showNextBus, 1000);
  }
  
  showNextBus();
}, false);
<div id="alertInfo"></div>

编辑

是的,我不允许当前时间是第一次运行的所有预定时间之后的情况。固定。我还更改了所有字符串比较,以使用 localeCompare ,我认为它更健壮。希望评论足够。