文
章
目
录
章
目
录
js开发经常会遇到需要判断当前时间是否处于指定时段的需求,比如在一些网站或应用中,根据不同的时间段展示不同的内容,或者限制某些操作只能在特定时段进行。今天,咱们就来聊聊如何用JavaScript实现这个功能,而且还支持多时段判断,同时会详细讲解代码里的一些关键知识点。
一、功能特性说明
在开始写代码之前,咱们先明确一下这个功能需要具备的几个特性:
- 时间转换:为了方便比较,我们会把所有的时间统一转换为分钟数。这样做的好处是,不管是比较不同时间点,还是处理复杂的时间范围,都变得更加简单直接。
- 跨天处理:要能够自动识别并正确处理跨越午夜的时间段,像夜班时间“22:00 – 06:00”这种情况。如果不处理好跨天问题,判断结果可能会出错。
- 容错处理:对于不完整的输入数组,要有默认值处理机制。而且,代码还得能处理简写的时间格式,比如把“8”自动转换为“08:00”,这样用户输入起来更方便,也减少了出错的可能性。
- 边界处理:在判断时间范围时,开始时间是包含在内的(即大于等于开始时间),结束时间同样包含在内(即小于等于结束时间)。
二、核心代码
下面就是实现这个功能的核心代码,我会逐行给大家解释:
/**
* 判断当前时间是否在指定时段内
* @param {Array<string>} timeArr - 时间范围数组,格式为 ['开始时间', '结束时间'],例如 ['08:00', '17:00']
* @returns {boolean} 当前时间在时段内返回true,否则返回false
*/
function isTimeInRange(timeArr) {
// 获取当前时间对象
const currentTime = new Date();
// 将时间字符串转换为分钟数
const toMinutes = (timeStr) => {
// 使用split分割小时和分钟,map(Number)转换为数字
const [hours, minutes] = timeStr.split(':').map(Number);
// 计算总分钟数 = 小时×60 + 分钟
return hours * 60 + (minutes || 0); // 处理未指定分钟的情况(如'08'自动转为0分钟)
};
// 将开始时间和结束时间转换为分钟数
// 使用可选链(?.)防止timeArr为undefined或null时出错
const startMinutes = timeArr[0] ? toMinutes(timeArr[0]) : 0; // 默认值设为0点
const endMinutes = timeArr[1] ? toMinutes(timeArr[1]) : 1439; // 默认值设为23:59(1439分钟)
// 计算当前时间的总分钟数
const currentMinutes = currentTime.getHours() * 60 + currentTime.getMinutes();
// 打印当前分钟数、开始分钟数和结束分钟数
console.log('当前分钟:', currentMinutes, '开始:', startMinutes, '结束:', endMinutes);
// 处理跨天时间范围(如22:00到次日06:00) ,当结束时间小于开始时间时,表示跨越了午夜
if(endMinutes < startMinutes) {
// 当前时间 >= 开始时间 或 当前时间 <= 结束时间 都算在范围内
return currentMinutes >= startMinutes || currentMinutes <= endMinutes;
}
// 普通情况(不跨天):当前时间在开始和结束时间之间
return currentMinutes >= startMinutes && currentMinutes <= endMinutes;
}
这段代码定义了一个名为isTimeInRange
的函数,它接收一个包含开始时间和结束时间的数组作为参数。
- 首先,通过
new Date()
获取当前时间对象。 - 然后,定义了一个内部函数
toMinutes
,它的作用是把传入的时间字符串(比如“08:00”)转换为分钟数。这里通过split(':')
方法把时间字符串按冒号分割成小时和分钟两部分,再用map(Number)
把它们转换为数字,最后计算出总分钟数。如果分钟部分没有指定(比如“08”),就默认分钟数为0。 - 接着,根据传入的时间数组
timeArr
,把开始时间和结束时间都转换为分钟数,并设置了默认值(如果数组为空或部分为空)。 - 之后,计算出当前时间的总分钟数
currentMinutes
。 - 再然后,判断是否是跨天的时间范围。如果结束时间的分钟数小于开始时间的分钟数,就说明是跨天的情况。在这种情况下,只要当前时间的分钟数大于等于开始时间的分钟数,或者小于等于结束时间的分钟数,就认为当前时间在指定范围内。
- 最后,如果不是跨天的情况,那就判断当前时间的分钟数是否在开始时间和结束时间的分钟数之间,如果是,就返回
true
,否则返回false
。
三、多时段判断实现
有时候,我们需要判断当前时间是否在多个时段中的任意一个时段内。下面的代码展示了如何实现这个功能:
// 多时段使用
const workHours = [['08:00', '10:00'],['11:00', '13:00'],['15:00', '21:00']]
function isInMultipleRanges(timeRanges) {
// 筛选多时段其中是否有一项(即一个时段)符合 符合返回true 不符合返回false
return timeRanges.some(range => isTimeInRange(range));
}
console.log('是否在多时段内:', isInMultipleRanges(workHours)); // true
这里定义了一个isInMultipleRanges
函数,它接收一个包含多个时间范围数组的参数timeRanges
。函数内部使用some
方法遍历timeRanges
数组,对每个子数组(即每个时间段)调用isTimeInRange
函数进行判断。只要有一个时间段符合条件,some
方法就会返回true
,表示当前时间在多个时段中的某一个时段内;如果所有时间段都不符合条件,就返回false
。
四、使用实例演示
为了让大家更好地理解这些函数的使用方法,下面通过一些实例来演示:
// 时段测试
console.log('08:00-17:00时段内:', isTimeInRange(['08:00', '17:00'])); // true
console.log('08:00-15:00时段内:', isTimeInRange(['08:00', '15:00'])); // false
console.log('22:00-18:00跨天时段:', isTimeInRange(['22:00', '18:00'])); // true
// 非常规测试
console.log('空数组测试:', isTimeInRange([])); // 使用默认值0-1439(全天) true
console.log('部分空测试:', isTimeInRange(['08:00'])); // 开始时间8:00,结束时间默认23:59 true
console.log('无效格式测试:', isTimeInRange(['8', '17'])); // 自动处理为08:00和17:00 true
这些实例分别测试了正常的时间段判断、跨天时间段判断,以及一些非常规情况的测试,比如空数组、部分空数组和无效格式的输入。从这些测试结果可以看出,我们的代码能够正确地处理各种情况,满足之前提到的功能特性要求。
通过上面的介绍,相信大家对如何用JavaScript判断当前时间是否在指定时段内,以及如何处理多时段判断有了更清晰的认识。在实际开发中,大家可以根据具体需求灵活运用这些代码,希望能帮助到大家!