Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Динамичный подсчет времени (https://javascript.ru/forum/misc/36700-dinamichnyjj-podschet-vremeni.html)

afterman 25.03.2013 10:18

Динамичный подсчет времени
 
Добрый день. Уважаемые знатоки, очень прошу у Вас помощи.

Задача следующая: есть массив времени приезда автобуса на остановку (например: 10:00, 10:09, 10:21 и.т.д). Нужно исходя из текущего времени (например сейчас 10:04), подсчитать сколько минут до ближайшего автобуса. Исходя из этих данных ответ должен быть 5. Но через минуту чтобы он без перезагрузки страницы уже показывал 4. А после того как времени стало уже 10:10, считать до следующего значения, то есть ответ уже 11.

Очень прошу помочь.

tsigel 25.03.2013 11:18

setInterval(currentTimeForBuss, 10000);
function currentTimeForBuss() {
//рассчитываем время и обновляем поле с ответом
}


Функция currentTimeForBuss будет вызываться каждые 10 секунд.
Пробуйте, пишите, поможем.

afterman 25.03.2013 11:24

Спасибо за ответ. Но вы не могли бы подробнее описать именно получение даты и сравнение ее с массивом времени, и соответственно вывод остатка времени. Потому как плохо разбираюсь в JS, а сроки поджимают ))

tsigel 25.03.2013 11:35

var timeBuss = ['9:30','10:30','11:40','11:45','11:50','12:30','13:30','14:30']
setInterval(currentTimeForBuss, 10000);
function currentTimeForBuss() {
  var date = new Date()//Получили текущую дату
  var time = { 
    hours: date.getHours(),
    minutes: date.getMinutes()
  }//получили часы и минуты
  alert(time.hours + ':' + time.minutes);

  for (var i = 0; i < timeBuss.lenght-2; i++) {//Цикл по массиву с расписанием
    var tmp = timeBuss[i].split(':');//разбили время расписания на часы и минуты
    var bussTime = {
       hours: tmp[0], minutes: tmp[1]  
    }
    tmp = timeBuss[i + 1].split(':');
    var nextBussTime = {
       hours: tmp[0], minutes: tmp[1]  
    }
    if ((time.hours >= bussTime.hours && time.hours <= nextBussTime.hours)
      && (time.minutes >= bussTime.minutes && time.minutes < nextBussTime.minutes)) {
        alert('Осталось: ' + nextBussTime.minutes - time.minutes);
    }
  }
}

Что-то типа этого...

afterman 25.03.2013 11:46

Большое спасибо, за помощь, но хотелось бы еще узнать если можно, вот что:

А как сравнить текущее время с временем из массива. И самое интересное когда текущее время больше отметки(ближайшего значения массива к текущему времени), как сделать так чтобы, оно далее сравнивало текущее время уже со следующим значением из массива?

afterman 25.03.2013 12:04

Почему то дело до алерта:
alert('Осталось: ' + nextBussTime.minutes - time.minutes);

не доходит. В чем может быть причина?

tsigel 25.03.2013 12:06

var timeBuss = ['9:30','10:30','11:40','11:45','11:50','12:30','13:30','14:30']
setInterval(currentTimeForBuss, 10000);
function currentTimeForBuss() {
    var date = new Date()//Получили текущую дату
    var time = {
        hours: date.getHours(),
        minutes: date.getMinutes()
    }//получили часы и минуты
    alert('Текущее время: ' +  (time.hours + ':' + time.minutes));

    for (var i = 0; i < timeBuss.length-1; i++) {//Цикл по массиву с расписанием
        var tmp = timeBuss[i].split(':');//разбили время расписания на часы и минуты
        var bussTime = {
            hours: tmp[0], minutes: tmp[1]
        }
        tmp = timeBuss[i + 1].split(':');
        var nextBussTime = {
            hours: tmp[0], minutes: tmp[1]
        }
        
        if ((time.hours >= bussTime.hours && time.hours <= nextBussTime.hours)) {
            var timeLeft = bussTime;
        }
    }
    alert("Осталось минут: " + (timeLeft.minutes - time.minutes))
};
currentTimeForBuss();

Неправильно написал length.

afterman 25.03.2013 12:11

Огромное спасибо, но осталась какая-то странность, считает неправильно.
Потому как у меня текущее время 11:10, а показывает что осталось 40 минут. Хотя есть и в 11:30 и 11:45. Не подскажите почему так происходит?

tsigel 25.03.2013 12:15

Я немного схалтурил по идее надо делать 2 цикла. Первый для нахождения часа в котором мы ждем автобус, а второй для нахождения минут. Данная функция рассчитана что в 1м часе может быть только 1 автобус (у меня 12 часов и работает)

afterman 25.03.2013 12:19

Если Вам не трудно, вы не могли бы дописать скрипт как правильно, поскольку вам это будет быстро, а у меня уйдет куча времени.

С меня понятное дело плюс в карму.
Очень прошу помочь.

tsigel 25.03.2013 12:34

var timeBuss = ['9:30', '10:30', '11:40', '11:45', '11:50', '12:10', '12:30', '12:41', '12:52', '12:55', '13:10']
setInterval(currentTimeForBuss, 5000);
function currentTimeForBuss() {
    var date = new Date()//Получили текущую дату
    var time = {
        hours:date.getHours(),
        minutes:date.getMinutes()
    }//получили часы и минуты
    console.log(time.hours + ':' + time.minutes);

    for (var i = 0; i < timeBuss.length - 1; i++) {//Цикл по массиву с расписанием
        var tmp = timeBuss[i].split(':');//разбили время расписания на часы и минуты
        var bussTime = {//время в расписании (номер i)
            hours:tmp[0], minutes:tmp[1]
        }
        tmp = timeBuss[i + 1].split(':');
        var nextBussTime = {//следующее время в расписании (i + 1)
            hours:tmp[0], minutes:tmp[1]
        }

        if ((time.hours >= bussTime.hours && time.hours <= nextBussTime.hours) &&
            (time.minutes >= bussTime.minutes && time.minutes < nextBussTime.minutes)) {
            var timeLeft = nextBussTime;
            break;
        }
    }
    console.log(timeLeft)
    if (time.hours < timeLeft.hours) {
        timeLeft.minutes = parseInt(timeLeft.minutes) + 60;
    }
    alert('Осталось минут: ' + (timeLeft.minutes - time.minutes));
};
currentTimeForBuss();

afterman 25.03.2013 12:46

Не переходит на следующую отметку, после того как 11:45 закончилось(алерт не показывается).
В консоле вот такая ошибка:
Uncaught TypeError: Cannot read property 'hours' of undefined 1.html:32
currentTimeForBuss
32 строка это
if (time.hours < timeLeft.hours) {


Если обновить страницу, то находит уже 11:50 и все работает.

Может знаете, как сделать чтобы без перезагрузки страницы сделать переход на следующую отметку?

tsigel 25.03.2013 12:52

я обновил.

afterman 25.03.2013 13:00

Всем большое спасибо! Отблагодарил плюсами в карму :)

afterman 09.04.2013 13:59

Появилась подзадача для этого скрипта. Имеется цикл который вызывает этот скрипт (используется вариант Дзен-трансгуманиста) для определения времени ближайшего автобуса.
Сейчас он считает только для первого раза. Для остальных не работает. Очень прошу помочь!

kingstakh 18.07.2014 16:40

Нужна помощь в доведении скрипта размещенного выше.
Пишу на jquery mobile расписание автобусов. Хотелось бы использовать вышеописанный скрипт для подсчета времени до прибытия автобуса. Отсюда и вопрос, данный пример работает с определенным массивом, указанным в скрипте, но верстка с query mobile подразумевает один большой код с разбивкой на страницы. Вставлять этот код на каждую страницу со своим массивом глупо и не оправдано. Может подскажете как использовать это скрипт один раз для всех страниц, с подгрузкой нужной строки (расписание автобуса на конкретной остановке) из файла данных в массив и вызов функции подсчета с конкретным массивом уже непосредственно в коде страницы?

<!doctype html>
<html>
<head>
    <title>My Page</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.css">
    <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.js"></script>  
	<script>
var timeBuss = ['9:30','10:30','11:40','11:45','11:50','12:30','13:20','14:06','14:56','15:06','15:36','16:16','16:43','17:06','17:23','17:34','17:52','18:04','18:10','19:06','19:36','20:06','20:35','21:08','21:31','22:08','22:26','22:53','23:26','23:59','00:06']
setInterval(currentTimeForBuss, 60);
function currentTimeForBuss() {
    var date = new Date()//Получили текущую дату
    var time = {
        hours: date.getHours(),
        minutes: date.getMinutes(),
		seconds: date.getSeconds()
    }//получили часы и минуты
	document.getElementById("current_time").innerHTML = ('Текущее время: ' +  (time.hours + ':' + time.minutes + ':' + time.seconds));

    for (var i = 0; i < timeBuss.length-1; i++) {//Цикл по массиву с расписанием
        var tmp = timeBuss[i].split(':');//разбили время расписания на часы и минуты
        var bussTime = {
            hours: tmp[0], minutes: tmp[1]
        }
        tmp = timeBuss[i + 1].split(':');
        var nextBussTime = {
            hours: tmp[0], minutes: tmp[1]
        }
        
        if ((time.hours >= bussTime.hours && time.hours <= nextBussTime.hours)) {
            var timeLeft = bussTime;
        }
    }
		document.getElementById("nextbusleft").innerHTML = ("Осталось минут: " + (timeLeft.minutes - time.minutes))
};
currentTimeForBuss();
</script>
</head>
<body>
    <div data-role="page">

        <div data-role="content">
        <ul data-role="listview">
    <li><a href="#second_page">Маршрут №1</a></li>
</ul>
        </div><!-- /content -->

 
    </div><!-- /page -->
        <div data-role="page" id="second_page">
 

        <div data-role="content">
        <ul data-role="listview">
    <li><a href="#busstop_1_1">Конечная 1 — Конечная 2</a></li>
    <li><a href="#busstop_1_2">Конечная 2 — Конечная 1</a></li>
</ul>
        </div><!-- /content -->

    </div><!-- /page -->
            <div data-role="page" id="busstop_1_1">
        <div data-role="content">
        <ul data-role="listview">
    <li><a href="#schedule_1_1">Остановка 1</a></li>
    <li><a href="#schedule_1_2">Остановка 2</a></li>    
</ul>
        </div><!-- /content -->

 
    </div><!-- /page -->
<div data-role="page" id="schedule_1_1">
        <div data-role="content">
			<div id="schedule">'9:30','10:30','11:40','11:45','11:50','12:30','13:20','14:06','14:56','15:06','15:06','16:06','16:06','17:06','23:59','00:06'</div>
            <div id="current_time"></div>
            <div id="nextbusleft"></div>
        </div><!-- /content -->
    </div><!-- /page -->

</div>

</body>
</html>

tsigel 22.07.2014 18:21

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

Вообще код иногда даёт странные результаты, но я думаю вы справитесь :)

Вызываем timerCurrentBuss и передаём туда массив времени.

<!doctype html>
<html>
<head>
    <title>My Page</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.css">
    <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.4.3/jquery.mobile-1.4.3.min.js"></script>  
	<script>

var timeBuss = ['9:30','10:30','11:40','11:45','11:50','12:30','13:20','14:06','14:56','15:06','15:36','16:16','16:43','17:06','17:23','17:34','17:52','18:04','18:10','19:06','19:36','20:06','20:35','21:08','21:31','22:08','22:26','22:53'  ,'23:26','23:59','00:06']

function timerCurrentBuss(time) {   

    var timeBuss = time;

    setInterval(currentTimeForBuss, 60);
    
    function currentTimeForBuss() {
        var date = new Date()//Получили текущую дату
        var time = {
            hours: date.getHours(),
            minutes: date.getMinutes(),
    		seconds: date.getSeconds()
        }//получили часы и минуты
    	document.getElementById("current_time").innerHTML = ('Текущее время: ' +  (time.hours + ':' + time.minutes + ':' +     time.seconds));
    
        for (var i = 0; i < timeBuss.length-1; i++) {//Цикл по массиву с расписанием
            var tmp = timeBuss[i].split(':');//разбили время расписания на часы и минуты
            var bussTime = {
                hours: tmp[0], minutes: tmp[1]
            }
            tmp = timeBuss[i + 1].split(':');
            var nextBussTime = {
                hours: tmp[0], minutes: tmp[1]
            }
            
            if ((time.hours >= bussTime.hours && time.hours <= nextBussTime.hours)) {
                var timeLeft = bussTime;
            }
        }
        
        document.getElementById("nextbusleft").innerHTML = ("Осталось минут: " + (timeLeft.minutes - time.minutes))
    };
}

timerCurrentBuss(timeBuss);

</script>
</head>
<body>
    <div data-role="page">

        <div data-role="content">
        <ul data-role="listview">
    <li><a href="#second_page">Маршрут №1</a></li>
</ul>
        </div><!-- /content -->

 
    </div><!-- /page -->
        <div data-role="page" id="second_page">
 

        <div data-role="content">
        <ul data-role="listview">
    <li><a href="#busstop_1_1">Конечная 1 — Конечная 2</a></li>
    <li><a href="#busstop_1_2">Конечная 2 — Конечная 1</a></li>
</ul>
        </div><!-- /content -->

    </div><!-- /page -->
            <div data-role="page" id="busstop_1_1">
        <div data-role="content">
        <ul data-role="listview">
    <li><a href="#schedule_1_1">Остановка 1</a></li>
    <li><a href="#schedule_1_2">Остановка 2</a></li>    
</ul>
        </div><!-- /content -->

 
    </div><!-- /page -->
<div data-role="page" id="schedule_1_1">
        <div data-role="content">
			<div id="schedule">'9:30','10:30','11:40','11:45','11:50','12:30','13:20','14:06','14:56','15:06','15:06','16:06','16:06','17:06','23:59','00:06'</div>
            <div id="current_time"></div>
            <div id="nextbusleft"></div>
        </div><!-- /content -->
    </div><!-- /page -->

</div>

</body>
</html>

kingstakh 28.12.2015 16:58

<!DOCTYPE html>
<html ng-app="app">
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <meta charset="utf-8">
  <title>Расписание</title>
<script>
angular.module("app", [])
  .controller('TabsDemoCtrl',function($scope,$http){
   
        $scope.string = '12:00, 12:10, 12:35, 13:07';
        $scope.arrString = new Array();
        $scope.arrString = $scope.string.split(',');
  console.log($scope.arrString)
    });
</script>
</head>
<body>        
  <ul ng-controller="TabsDemoCtrl">
    <li ng-repeat="bustime in arrString track by $index">
       {{bustime}} (Тут условие, если текущее время < {{bustime}}, то показывать оставшееся время, если >, то "Автобус ушел"
    </li>
</ul>


</body>
</html>


Всем доброго дня! Если у кого-то будет возможность и время, помогите решить задачу с расписанием.

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

рони 28.12.2015 21:48

как правильно написать данный код и как обновляют данные в angular?

<!DOCTYPE html>
<html ng-app="app">
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <meta charset="utf-8">
  <title>Расписание</title>
<script>
 var c = {
    formatTime: function(b) {
        b = Math.floor(b / 1E3);
        var a = Math.floor(b / 60),
            d = Math.floor(a / 60);
        b %= 60;
        a %= 60;
        return c.two(d % 24) + " час. " + c.two(a) + " мин. " + c.two(b) + " сек. "
    },
    two: function(b) {
        return (9 < b ? "" : "0") + b
    }
};
angular.module("app", []).controller("TabsDemoCtrl", function($scope, $http) {
    $scope.json = '["12:00", "12:10", "12:35", "23:37"]';
    $scope.arrString = JSON.parse($scope.json);
    $scope.myArray = [];
    $scope.fn = function ()
    {
       $scope.myArray = [];
       angular.forEach($scope.arrString,
       function(el) {
        el = el.match(/\d+/g);
        var date = new Date;
        date.setHours(+el[0], +el[1],0,0);
        date = date.getTime() - (new Date).getTime();
        $scope.myArray.push(date < 0 ? "Автобус ушел" : "Осталось : " + c.formatTime(date));

    })

      console.log($scope.myArray)
      window.setTimeout($scope.fn,1000)//не смог сделать вывод новых данных
    }
   $scope.fn()

});
</script>
</head>
<body>
  <ul ng-controller="TabsDemoCtrl">
    <li ng-repeat="bustime in arrString track by $index">
       {{bustime + ' ' +myArray[$index]}}
    </li>
</ul>


</body>
</html>

kingstakh 28.12.2015 22:11

Цитата:

Сообщение от Rise
'12:00, 12:10, 12:35, 13:07' - это не json-строка, если получаешь в формате json, то и в примере наверное надо в этом же формате писать как ты думаешь?

Прошу прощения, мое упущение, в действительности строка имеет вид
["12:00", "12:10", "12:35", "23:37"]


Я все упростил для примера, чтобы передать саму суть

kingstakh 28.12.2015 22:13

Цитата:

Сообщение от рони
как правильно написать данный код и как обновляют данные в angular?

Спасибо, Рони, именно это я и хотел. А по вопросу с обновлением данных попробую спросить в ветке по AngularJS или не стоит плодить темы?

рони 28.12.2015 22:40

kingstakh,
лучше бы вы сразу в той теме написали :) думаю и тут заметят.

kingstakh 28.12.2015 22:50

Цитата:

Сообщение от рони (Сообщение 401792)
kingstakh,
лучше бы вы сразу в той теме написали :) думаю и тут заметят.

Просто здесь давно обсуждают схожий вопрос, поэтому тут и спросил, чтобы "по шапке" не получить ))). Если никто тут не заметит рискну спросить там ))) :write:

рони 28.12.2015 22:59

kingstakh,
ок.

kingstakh 29.12.2015 10:24

Цитата:

Сообщение от рони (Сообщение 401795)
kingstakh,
ок.

Для меня 2 новости, одна хорошая, вторая плохая )))
Хорошая новость, что в приложении обновление данных работает, то есть идет обратный отсчет времени. Плохая, данные JSON у меня не разделяются кавычками.

То есть в примере:
$scope.json = '["12:00", "12:10", "12:35", "23:37"]';


А у меня:
$scope.json = '["12:00, 12:10, 12:35, 23:37"]';


Где исправить код, чтобы работало с моей строкой? :blink:

Решено, додумался, спасибо!

kingstakh 29.12.2015 10:57

Может кому-то понадобиться, мой вариант

<!DOCTYPE html>
<html ng-app="app">
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <meta charset="utf-8">
  <title>Расписание</title>
<script>
 var c = {
    formatTime: function(b) {
        b = Math.floor(b / 1E3);
        var a = Math.floor(b / 60),
            d = Math.floor(a / 60);
        b %= 60;
        a %= 60;
        return c.two(d % 24) + " час. " + c.two(a) + " мин. " + c.two(b) + " сек. "
    },
    two: function(b) {
        return (9 < b ? "" : "0") + b
    }
};
angular.module("app", [])
  //Часы
.controller("TimeCtrl", function($scope, $interval) {
  var tick = function() {
    $scope.clock = Date.now();
  }
  tick();
  $interval(tick, 1000);
})

.controller("TabsDemoCtrl", function($scope) {
    $scope.json = '6:00, 8:45, 12:00, 12:10, 12:35, 23:37'; // Парсинг в другом контроллере, поэтому данные имеют такой вид
    $scope.arrString = new Array();
    $scope.arrString = $scope.json.split(',');
    $scope.myArray = [];
    $scope.fn = function ()
    {
       $scope.myArray = [];
       angular.forEach($scope.arrString,
       function(el) {
        el = el.match(/\d+/g);
        var date = new Date;
        date.setHours(+el[0], +el[1],0,0);
        date = date.getTime() - (new Date).getTime();
        $scope.myArray.push(date < 0 ? "Автобус ушел" : "Осталось : " + c.formatTime(date));

    })

      console.log($scope.myArray)
      window.setTimeout($scope.fn,1000) // Вывод данных в приложении работает
    }
   $scope.fn()

});
</script>
</head>
<body>
<h3 ng-controller="TimeCtrl">Сейчас {{ clock | date:'HH:mm:ss'}}</h3>
  <ul ng-controller="TabsDemoCtrl">
    <li ng-repeat="bustime in arrString track by $index">
       {{bustime + ' ' +myArray[$index]}}
    </li>
</ul>

</body>
</html>

рони 29.12.2015 11:06

kingstakh,
хотелось бы увидеть обновление времени или узнать почему в посте 20 не работает вывод времени.

kingstakh 29.12.2015 11:18

Цитата:

Сообщение от рони (Сообщение 401817)
kingstakh,
хотелось бы увидеть обновление времени или узнать почему в посте 20 не работает вывод времени.

Не работает в браузере, в телефоне - работает. Я ничего не менял в этой строке. Может это потому, что в приложении подключен jQuery, а в примере нет :-?

А нет, jQuery не играет роли, у меня еще контроллер текущего времени есть, с ним и здесь все заработало

kingstakh 29.12.2015 12:04

Рабочий вариант с $interval

<!DOCTYPE html>
<html ng-app="app">
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <meta charset="utf-8">
  <title>Расписание</title>
<script>
 var c = {
    formatTime: function(b) {
        b = Math.floor(b / 1E3);
        var a = Math.floor(b / 60),
            d = Math.floor(a / 60);
        b %= 60;
        a %= 60;
        return c.two(d % 24) + " час. " + c.two(a) + " мин. " + c.two(b) + " сек. "
    },
    two: function(b) {
        return (9 < b ? "" : "0") + b
    }
};
angular.module("app", [])

.controller("TabsDemoCtrl", function($scope, $interval) {
    $scope.json = '6:00, 8:45, 12:00, 12:10, 12:35, 23:37'; // Парсинг в другом контроллере, поэтому данные имеют такой вид
    $scope.arrString = new Array();
    $scope.arrString = $scope.json.split(',');
    $scope.myArray = [];

    var tick = function() {
      $scope.clock = Date.now();
    }
    tick();
    $interval(tick, 1000);

    $scope.fn = function ()
    {
       $scope.myArray = [];
       angular.forEach($scope.arrString,
       function(el) {
        el = el.match(/\d+/g);
        var date = new Date;
        date.setHours(+el[0], +el[1],0,0);
        date = date.getTime() - (new Date).getTime();
        $scope.myArray.push(date < 0 ? "Автобус ушел" : "Осталось : " + c.formatTime(date));

    })

      console.log($scope.myArray)
      window.setTimeout($scope.fn,1000) // Вывод данных в приложении работает
    }
   $scope.fn()

});
</script>
</head>
<body>
  <ul ng-controller="TabsDemoCtrl">
    <li ng-repeat="bustime in arrString track by $index">
       {{bustime + ' ' +myArray[$index]}}
    </li>
</ul>

</body>
</html>

kingstakh 04.01.2016 16:44

Цитата:

Сообщение от рони (Сообщение 401817)
kingstakh,
хотелось бы увидеть обновление времени или узнать почему в посте 20 не работает вывод времени.

У меня снова "грабли". Пример работает, все отлично, но у меня на одной странице расписание на рабочие и выходные дни, поэтому два "потока" данных. С одним, как в примере, работает, но когда дублирую функция для второго - зависает.

<!DOCTYPE html>
<html ng-app="app">
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <meta charset="utf-8">
  <title>Расписание</title>
<script>
 var c = {
    formatTime: function(b) {
        b = Math.floor(b / 1E3);
        var a = Math.floor(b / 60),
            d = Math.floor(a / 60);
        b %= 60;
        a %= 60;
        return c.two(d % 24) + " час. " + c.two(a) + " мин. " + c.two(b) + " сек. "
    },
    two: function(b) {
        return (9 < b ? "" : "0") + b
    }
};
angular.module("app", [])
  //Часы
.controller("TimeCtrl", function($scope, $interval) {
  var tick = function() {
    $scope.clock = Date.now();
  }
  tick();
  $interval(tick, 1000);
})

.controller("TabsDemoCtrl", function($scope) {
    $scope.work = '6:00, 8:45, 12:00, 12:10, 12:35, 23:37'; // Рабочие дни
    $scope.weekend = '6:00, 8:45, 12:00, 12:10, 12:35, 23:37'; // Выходные дни 
    $scope.arrString = new Array();
    $scope.arrString = $scope.work.split(',');
    $scope.myArray = [];
    $scope.fn = function ()
    {
       $scope.myArray = [];
       angular.forEach($scope.arrString,
       function(el) {
        el = el.match(/\d+/g);
        var date = new Date;
        date.setHours(+el[0], +el[1],0,0);
        date = date.getTime() - (new Date).getTime();
        $scope.myArray.push(date < 0 ? "Автобус ушел" : "Осталось : " + c.formatTime(date));

    })

      console.log($scope.myArray)
      window.setTimeout($scope.fn,1000) // Вывод данных в приложении работает
    }
   $scope.fn()

});
</script>
</head>
<body>
<h3 ng-controller="TimeCtrl">Сейчас {{ clock | date:'HH:mm:ss'}}</h3>
  <ul ng-controller="TabsDemoCtrl">
    <li ng-repeat="bustime in arrString track by $index">
       {{bustime + ' ' +myArray[$index]}}
    </li>
</ul>
  <ul ng-controller="TabsDemoCtrl">
Здесь для выходных дней
    <li ng-repeat="bustime in arrString track by $index">
       {{bustime + ' ' +myArray[$index]}}
    </li>
</ul>

</body>
</html>

рони 04.01.2016 19:41

kingstakh,
<!DOCTYPE html>
<html ng-app="app">
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <meta charset="utf-8">
  <title>Расписание</title>
<script>
 var c = {
    formatTime: function(b) {
        b = Math.floor(b / 1E3);
        var a = Math.floor(b / 60),
            d = Math.floor(a / 60);
        b %= 60;
        a %= 60;
        return c.two(d % 24) + " час. " + c.two(a) + " мин. " + c.two(b) + " сек. "
    },
    two: function(b) {
        return (9 < b ? "" : "0") + b
    }
};
angular.module("app", [])
  //Часы
.controller("TimeCtrl", function($scope, $interval) {
  var tick = function() {
    $scope.clock = Date.now();
  }
  tick();
  $interval(tick, 1000);
})

.controller("TabsDemoCtrl", function($scope) {
    $scope.work = '6:00, 8:45, 12:00, 12:10, 12:35, 23:37'; // Рабочие дни
    $scope.weekend = '6:00, 8:45, 13:00, 14:10, 15:35, 23:50'; // Выходные дни
    $scope.fn = function ()
    {  function foo(data) {
        var el = data.match(/\d+/g);
        var date = new Date;
        date.setHours(+el[0], +el[1],0,0);
        date = date.getTime() - (new Date).getTime();
        return data + ' ' + (date < 0 ? "Автобус ушел" : "Осталось : " + c.formatTime(date));

    }
       $scope.myArray = $scope.work.split(',').map(foo)
       $scope.arrString = $scope.weekend.split(',').map(foo)
       window.setTimeout($scope.fn,1000) // Вывод данных в приложении работает
    }
   $scope.fn()

});
</script>
</head>
<body>
<h3 ng-controller="TimeCtrl">Сейчас {{ clock | date:'HH:mm:ss'}}</h3>
  <ul ng-controller="TabsDemoCtrl">
    <li ng-repeat="bustime in myArray track by $index">
       {{bustime}}
    </li>
</ul>
  <ul ng-controller="TabsDemoCtrl">
Здесь для выходных дней
    <li ng-repeat="bustime in arrString track by $index">
       {{bustime}}
    </li>
</ul>

</body>
</html>

Keramet 04.01.2016 21:15

А не проще ли всё перевести в минуты (и расписание, и текущее время), а при отображении опять перевести в формат "чч:мм"?

рони 04.01.2016 21:28

Keramet,
не понял, может вы код напишите?

Keramet 04.01.2016 21:45

рони,
я б с удовольствием, но пока только учусь )) и на ваших примерах тоже.
Мне просто кажется, проще представить всё в минутах от начала суток (от 0 до 1440), чтоб не разбирать время отдельно на часы и минуты.
Например массив '6:00, 8:45, 12:00, 12:10, 12:35, 23:37' будет выглядеть как "360, 525, 720, 730, 755, 1417". Текущее время, например, 11:40 будет 700. Ну это только идея

рони 04.01.2016 21:57

Keramet,
ещё труднее по моему будет.

Keramet 04.01.2016 21:58

Цитата:

Сообщение от рони (Сообщение 402570)
Keramet,
ещё труднее по моему будет.

Просто функцию преобразования в минуты и обратно реализовать проще париной репы.
Определить место текущего времени в массиве расписания (переведенное в минуты) тоже просто, посчитали разницу до соседнего элемента и перевели это время обратно в "чч:мм". а возиться с часами отдельно и с минутами сложнее. ИМХО

ну, профессору виднее :)

рони 04.01.2016 22:04

Цитата:

Сообщение от Keramet
Просто функцию преобразования в минуты и обратно реализовать проще париной репы.

и как прицепить к этому разницу с текущим временем?

Keramet 04.01.2016 23:48

Цитата:

Сообщение от рони (Сообщение 402574)
и как прицепить к этому разницу с текущим временем?

ну как-то так :)
var nowTime = new Date();
	var nowTimeF = 60*nowTime.getHours() + nowTime.getMinutes();
	var hours = ['6:00', '8:45', '12:00', '12:10', '12:35', '23:37'];

	function formatT(str){
		var i, h, m;
		i = str.indexOf(":");
		h = str.substring(0, i);
		m = str.substring(i + 1, str.length);
		return 60*h + 1*m;
	}
	var hoursF = hours.map(function(h) {return formatT(h);});
	
	if (nowTimeF > hoursF[hoursF.length]) alert ("Опять от меня сбежала последняя электричка...")
	else {
		for(var i = hoursF.length - 1; i >= 1; i--)  {
			if (nowTimeF > hoursF[i-1]) break;
		}
		var timeToGo = hoursF[i] - nowTimeF;
		alert("До отправления: " + Math.floor(timeToGo / 60) + "ч " + timeToGo % 60 + "мин");
	};

не так и просто, как мне казалось :thanks:

kingstakh 05.01.2016 09:27

Цитата:

Сообщение от рони (Сообщение 402544)
kingstakh,

Огромное спасибо! То что я воротил с кодом, даже выкладывать не буду, стыдно :cray:, хоть и работало через пень-колоду.

kingstakh 05.01.2016 10:07

Цитата:

Сообщение от рони (Сообщение 402544)
kingstakh,

Хм, протестировал в приложении, почему-то тоже подвисает после просмотра одной остановки и возврата к выбору другой ... Наверное что-то у меня не так


Часовой пояс GMT +3, время: 02:41.