确定当前时间是否在一组时间范围内

确定当前时间是否在一组时间范围内

问题描述:

对于以javascript编写的网站拦截/生产力应用程序,我希望用户输入一系列可用于空闲时间(在当地时间)的时间范围。例如:确定当前时间是否在一组时间范围内

06:00-06:30

12:30-13:00

23:45-00:不要求15

24格式(我只是假设它会更容易)

然后,程序应该根据当前时间检查指定的空闲时间范围,以确定块模式是打开还是关闭。

我的主要想法是使用内置的JavaScript函数来抓取当前的DateTime,并在必要时将其转换为24小时格式。我认为时间范围将在一个数组中。我不确定如何检查当前日期是否在数组范围内。

该逻辑还必须能够处理从23:00到0:00的交叉。

无论如何,这是我的思路。感谢任何建议,包括采取不同的路径。

+0

这将是容易得多,如果范围为在单个单元像分钟(例如06:00-0630将是360-390)或秒。你有什么尝试?就目前而言,这个问题太广泛了。你要求某人为你编写所有的代码。 – RobG

无论如何,这是我的思路。感谢任何建议,包括采取不同的路径。

如果你想检查是否当前时间是在范围内,则范围应该DATE + TIME如当前时间为DATE + TIME

可能的解决方法

您可以转换所有三个日期时刻到瞬间实例,只是使用

start.isBefore(current) 
&& current.isBefore(end) 

瞬间文档isBeforeisAfterhttps://momentjs.com/

+0

这不是一个真正的答案。可以使用''这个简单的Date对象来完成“可能的解决方案”,但OP只需要时间。 – RobG

“我不知道如何检查,如果当前的日期是数组中的范围内。”

你会遍历数组并进行比较。我建议将范围存储为一个对象数组,其中每个单独的范围类似于{start: "10:15", end: "10:45"}

JavaScript没有时间对象,只有Date包含日期和时间信息。所以我认为将当前时间转换为字符串“hh:mm”格式是最容易的,然后只需将简单的字符串与范围值进行比较,而不用担心将范围值转换为日期对象。所以:

var timeRanges = [ 
    { start: "06:00", stop: "06:30" }, 
    { start: "12:30", stop: "13:00" }, 
    { start: "23:45", stop: "00:15" } 
] 

function isTimeInRange(time) { 
    for (var i = 0; i < timeRanges.length; i++) { 
    var range = timeRanges[i] 
    if ((time > range.start && time < range.stop) 
     || (range.start > range.stop && (time > range.start || time < range.stop))) { 
     return true 
    } 
    } 
    return false 
} 

但是你可以使代码更简洁和更短的,使用array .some() method,有无arrow functions

var timeRanges = [ 
 
    { start: "06:00", stop: "06:30" }, 
 
    { start: "12:30", stop: "13:00" }, 
 
    { start: "23:45", stop: "00:15" } 
 
] 
 

 
function isTimeInRange(time) { 
 
    return timeRanges.some(range => 
 
    (time > range.start && time < range.stop) 
 
    || (range.start > range.stop && (time > range.start || time < range.stop)) 
 
) 
 
} 
 

 
function pad(d) { 
 
    return ("0" + d).slice(-2) 
 
} 
 

 
function getCurrentTime() { 
 
    var now = new Date() 
 
    return pad(now.getHours()) + ":" + pad(now.getMinutes()) 
 
} 
 

 
console.log("Current time in range? " + isTimeInRange(getCurrentTime())) 
 
// test some other times 
 
console.log(isTimeInRange("06:15")) // true 
 
console.log(isTimeInRange("12:35")) // true 
 
console.log(isTimeInRange("13:30")) // false 
 
console.log(isTimeInRange("23:50")) // true 
 
console.log(isTimeInRange("00:14")) // true

很明显,你可以改变<>到如果需要,可以使用<=>=

尝试

start = "10:10"; 
 
end = "16:30"; 
 
function isInRange(start, end, current){ 
 
    start = convertTimeToMinute(start); 
 
    end = convertTimeToMinute(end); 
 
    current = convertTimeToMinute(current); 
 
    return start <= current && current <= end; 
 
} 
 
function convertTimeToMinute(time){ 
 
    return +time.slice(0,1)*60 + +time.slice(3,4); 
 
} 
 

 
console.log(isInRange(start,end, "15:20")); 
 
console.log(isInRange(start,end, "20:20"));

+0

'+ time.slice(0,1)* 60 + time.slice(3,4)'应该是'time.slice(0,2)* 60 + + time.slice(3);'since'* 60 '会将第一个字符串转换为数字,但第二个切片将使其再次成为一个字符串。 ;-)发布时,'convertTimeToMinute('20:20'))'返回'1202'而不是'1220'。 – RobG

+0

糟糕。我的错。感谢@RobG – Duannx