在数组中查找时间,如果找不到,请选择上一个

时间:2019-04-21 22:58:06

标签: javascript jquery arrays time

我有一个带时间的数组,其中第一个数字是小时,第二个数字是分钟。还有一个时间间隔(以分钟为单位),开始时间和结束时间。例如:

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之前的时间? (请注意,startTimeendTimeintervaltime都是动态的。

在此示例中,最后的result应该是[14, 0]

另一个示例,如果time[13, 20],则最后的result应该是[12, 40]

感谢所有帮助!

3 个答案:

答案 0 :(得分:1)

首先,您需要将日期和时间用作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>

答案 1 :(得分:1)

尝试一下:

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);

答案 2 :(得分:1)

在这里,您有一种可能适合您的递归方法。请注意,我们正在getTimeBefore()方法接收的参数上使用destructuring

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;}