Определение оставшегося времени до отправления автобуса - PullRequest
0 голосов
/ 15 ноября 2018

Для нашей системы цифровых вывесок я бы хотел показать, как долго будет отправляться следующий автобус.Я построил массив, который хранит все время, и успешно (возможно, не элегантно или неэффективно) получил его, чтобы изменить все это, чтобы показать, сколько времени осталось (положительного или отрицательного) до каждого перечисленного вылета.

Iнужно подтолкнуть в правильном направлении, чтобы определить, какая шина будет следующей в зависимости от текущего времени.Если через 7 минут есть автобус, мне нужно только отобразить этот, а не следующий, который отправляется через 20 минут.

Я думал, возможно, для цикла , который смотрит намассив оставшихся времен и останавливается, когда в первый раз он достигает положительного значения.Я обеспокоен тем, что это может вызвать проблемы, которые я не рассматриваю.

Любая помощь будет принята с благодарностью.

ОБНОВЛЕНИЕ: К сожалению, все предоставленные решения приводили к ошибкам в нашей системе вывесок.Я подозреваю, что он работает на какой-то ограниченной версии 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 голосов
/ 15 ноября 2018

Вам нужно выполнить поиск только один раз, чтобы найти индекс следующего запланированного времени. Затем, по истечении каждого времени, увеличивайте индекс, чтобы получить следующий раз. Как только вы окажетесь в конце массива, начните снова.

Пример ниже, большая часть кода - это настройки и помощники. Он создает фиктивное расписание на каждые две минуты 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 , который я считаю более надежным. Надеюсь, комментариев будет достаточно.

0 голосов
/ 15 ноября 2018

Я использовал 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...