Найти время в массиве, если не найдено, выбрать предыдущее - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть массив со временем, где первое число является часом, а второе число является минутой. Также есть интервал времени (в минутах), время начала и время окончания. Так, например:

var time = [14, 35];
var interval = 40; // in minutes
var startTime = [10, 40];
var endTime = [16, 20];

Начнется с startTime и увеличится на interval 40 минут.

[10, 40]
[11, 20]
[12, 0]
[12, 40]
[13, 20]
[14, 0]
[14, 40]
...

Как я могу сделать так, чтобы он нашел время, которое прямо перед var time? (Обратите внимание, что startTime, endTime, interval и time будут динамическими.

В этом примере конечный result должен быть [14, 0].

Другой пример, если time равен [13, 20], конечный result должен быть [12, 40].

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 22 апреля 2019

Попробуйте это:

var time = [14, 35],
    interval = 45, // in minutes
    startTime = [10, 40],
    endTime = [16, 20];

var a=startTime[0]*60+startTime[0],
    out=a,
    findTime=time[0]*60+time[0],
    endMins=endTime[0]*60+endTime[0];

while(a<findTime && a<endMins){
    out=a;
    a+=interval;
}

console.log(Math.floor(out/60),out%60);
1 голос
/ 22 апреля 2019

Здесь у вас есть рекурсивный подход, который может работать на вас. Обратите внимание, что мы используем деструктурирование для аргументов, которые получает метод getTimeBefore().

const getTimeBefore = ([startH, startM], [endH, endM], ival, [checkH, checkM]) =>
{
    let [newH, newM] = [startH + Math.floor((startM + ival) / 60), (startM + ival) % 60];

    if (newH >= checkH && newM >= checkM)
        return [startH, startM];
    else if (newH >= endH && newM >= endM)
        return "Not Found" // Or anything you need;
    else
        return getTimeBefore([newH, newM], [endH, endM], ival, [checkH, checkM]);    
}

console.log("Time before 14:35 is:", getTimeBefore([10,40], [16,20], 40, [14,35]));
console.log("Time before 13:20 is:", getTimeBefore([10,40], [16,20], 40, [13,20]));
console.log("Time before 19:05 is:", getTimeBefore([10,40], [16,20], 40, [19,05]));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
1 голос
/ 22 апреля 2019

Прежде всего вам нужно использовать Даты и Время как DATE

В следующем вы должны убедиться:

startTime <= endTime

А также

startTime <= time <= endTime

$(function(){
    let
        time = [14, 35],
        interval = 45, // in minutes
        startTime = [10, 40],
        endTime = [16, 20],
        markTime = true;

    time = new Date('2000-01-01 ' + time[0] + ':' + time[1] + ':00');
    startTime = new Date('2000-01-01 ' + startTime[0] + ':' + startTime[1] + ':00');
    endTime = new Date('2000-01-01 ' + endTime[0] + ':' + endTime[1] + ':00');

    while (startTime <= endTime) {
        let nextTime = new Date(startTime.getTime() + interval*60000);

        if (nextTime > time && markTime) {
            $("#divTimes").append('<b>' + startTime.getHours() + ':' + startTime.getMinutes() + ' <<</b><br/>');
            markTime = false;
        } else {
            $("#divTimes").append(startTime.getHours() + ':' + startTime.getMinutes() + '<br/>');
        }


        startTime = new Date(startTime.getTime() + interval*60000)
    }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="divTimes">

</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...