判定某个小时是否处于一个时间区间的实现(含跨天)

本文介绍了一种在JavaScript中判断当前时间是否处于跨天时间区间内的方法,特别关注了起始时间晚于结束时间的情况,如20点至次日3点。通过转换时间戳并调整区间边界,实现了准确的时间段判定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先阐述下具体的需求,举例有如下几个时间段:

A.3-9点

B.9-14点

C.14-20点

D.20-3点

a,b,c三个时间段判定很简单,只需获取当前时间点对应的小时值,例如当前时间为14点,哪么得到小时值为14,然后根据如下条件判定即可,获取到是否处在某个时间段内(用A组配置举例):

//起始时间
var beginHour = 3;
//结束时间
var endHour = 9;
//目标时间
var targetHour = 14;
if(targetHour >= beginHour && targetHour < endHour ){
   console.log("查找成功(目标时间:%d 处于%d-%d区间内)!",targetHour,beginHour,endHour);
}
else{
    console.log("非常遗憾,区间查找失败!");
}

以上代码能满足正常的区间值验证,但是将区间值换成D组配置,哪么以上的方法就不再适用。

我们来观察下D组的配置,起始时间为20点,结束时间为3点,很明显已经跨天了。

跨天有三种情况,举例:

D组配置:20-3点

情况1:当前时间点在20点以后,例如20,21,22,23,即当前的小时大于区间的起始值

情况2:当前时间点在20点以前,例如19,18,17,16...,即当前的小时小于区间的起始值

情况3:当前时间点等于20点,这种情况就不做阐述了,等20点的肯定就对应这组配置了。

 

举例时间日期:2019-12-11 21:00:00 转为时间戳(秒)=1576069200

先来说情况1:当前时间点在20点以后,说明需要往后查找配置,也就是区间起始时间不变,区间结束值往后移一天

起始的时间值为:2019-12-11 20:00:00 转为时间戳(秒)=1576065600

结束的时间值为:2019-12-12 03:00:00 转为时间戳(秒)=1576090800

用程序实现的逻辑:当前的小时值>区间起始值,哪么区间结束值往后移一天

 

举例时间日期:2019-12-11 18:00:00 转为时间戳(秒)=1576058400

再说情况2:当前时间点在20点以前,说明当前时间还没到,需要往前查找配置,也就是区间起始值往前移一天,区间结束值不变

起始的时间值为:2019-12-10 20:00:00 转为时间戳(秒)=1575979200

结束的时间值为:2019-12:11 03:00:00 转为时间戳(秒)=1576004400

用程序实现的逻辑:当前的小时值<区间起始值,哪么区间起始值往后前移一天

两种情况都得到了起始时间戳,结束时间戳,当前的时间戳,通过时间戳进行判断即可完成区间判定,

用程序实现的逻辑:当前的时间戳>=起始时间戳 && 当前时间戳<结束时间戳

时间转换工具

 

以上主要阐述了基本思路,具体代码如下(代码使用js实现,运行环境为node.js):

/**
 * 获取当前时间
 */
function getCurTimeStamps() {
    return Math.ceil(Date.now() / 1000);
}

/**
 * 根据时间戳获取年,月,日,时,分,秒
 * @param {*} nTimeStamps 
 */
function getTimeInfo(nTimeStamps) {
    //转毫秒
    var date = new Date(nTimeStamps * 1000);
    //返回数据
    var retData = {
        nYear: date.getFullYear(),
        nMonth: date.getMonth() + 1,
        nDay: date.getDate(),
        nHour: date.getHours(),
        nMinutes: date.getMinutes(),
        nSeconds: date.getSeconds()
    };
    return retData;
}

/**
 * 字符时间转时间戳
 */
function strTimeToTimeStamps(strtime) {
    //时间转换
    var date = new Date(strtime);
    //获取时间戳
    var timeStamps = Date.parse(date);
    return timeStamps;
}

/**
 * 时间戳转字符时间
 * @param {*} nTimeStamps 
 */
function timeStampsToStrTime(nTimeStamps) {
    //转毫秒
    var date = new Date(nTimeStamps);
    //时间字符串
    var timeString = date.getFullYear() + "-" +
        (date.getMonth() + 1) + "-" +
        date.getDate() + " " +
        date.getHours() + ":" +
        date.getMinutes() + ":" +
        date.getSeconds() + ":" +
        date.getMilliseconds();
    return timeString;
}

/**
 * 验证时间是否在指定时间段内
 * @param {*} beginHour 
 * @param {*} endHour 
 * @param {*} targetHour 
 */
function isTargetHourArea(beginHour, endHour, targetHour) {
    //是否设置时间
    var bSetHourDay = false;
    if (endHour < beginHour) {
        bSetHourDay = true;
    }

    //起始小时字符
    var beginHour_String = "";
    //结束小时字符
    var endHour_String = "";
    //目标时间段字符
    var targetHour_String = "";
    //目标时间段时间戳
    var targetHourStamps = 0;
    //当前时间戳
    var nCurTimeStamps = getCurTimeStamps();
    //获取时间信息
    var timeInfo = getTimeInfo(nCurTimeStamps);
    //设置目标时间段字符
    targetHour_String = timeInfo.nYear + "-" + timeInfo.nMonth + "-" + timeInfo.nDay + " " + targetHour + ":00:00:00";
    //目标时间段时间戳
    targetHourStamps= strTimeToTimeStamps(targetHour_String);
    //设置时间判断
    if (bSetHourDay) {
        //当前小时大于起始时间
        if (targetHour >= beginHour) {
            //结束时间-天=加1
            var dayTimeStamps = nCurTimeStamps + (24 * 60 * 60);
            //时间信息
            var timeInfoTemp = getTimeInfo(dayTimeStamps);
            //起始时间字符串
            beginHour_String = timeInfo.nYear + "-" + timeInfo.nMonth + "-" + timeInfo.nDay + " " + beginHour + ":00:00:00";
            //结束时间字符串
            endHour_String = timeInfoTemp.nYear + "-" + timeInfoTemp.nMonth + "-" + timeInfoTemp.nDay + " " + endHour + ":00:00:00";
        }
        //当前小时小于起始时间
        else if (targetHour < beginHour) {
            //起始时间-天-减1
            var dayTimeStamps = nCurTimeStamps - (24 * 60 * 60);
            //时间信息
            var timeInfoTemp = getTimeInfo(dayTimeStamps);
            //起始时间字符串
            beginHour_String = timeInfoTemp.nYear + "-" + timeInfoTemp.nMonth + "-" + timeInfoTemp.nDay + " " + beginHour + ":00:00:00";
            //结束时间字符串
            endHour_String = timeInfo.nYear + "-" + timeInfo.nMonth + "-" + timeInfo.nDay + " " + endHour + ":00:00:00";
        }
    }
    else {
        //起始时间字符串
        beginHour_String = timeInfo.nYear + "-" + timeInfo.nMonth + "-" + timeInfo.nDay + " " + beginHour + ":00:00:00";
        //结束时间字符串
        endHour_String = timeInfo.nYear + "-" + timeInfo.nMonth + "-" + timeInfo.nDay + " " + endHour + ":00:00:00";
    }

    //起始时间戳
    var beginHourStamps = strTimeToTimeStamps(beginHour_String);
    //结束时间戳
    var endHourStamps = strTimeToTimeStamps(endHour_String);

    //返回信息
    var retInfo = {};
    //code
    retInfo.code = 0;
    //起始时间戳
    retInfo.beginHourStamps = beginHourStamps;
    //起始时间戳字符串
    retInfo.strBeginHourStamps = timeStampsToStrTime(beginHourStamps);
    //结束时间戳
    retInfo.endHourStamps = endHourStamps;
    //结束时间字符串
    retInfo.strEndHourStamps = timeStampsToStrTime(endHourStamps);
    //目标时间戳
    retInfo.targetHourStamps = targetHourStamps;
    //目标时间字符串
    retInfo.strTargetHourStamps = timeStampsToStrTime(targetHourStamps);
    //区间验证
    if(retInfo.targetHourStamps >= retInfo.beginHourStamps && retInfo.targetHourStamps < retInfo.endHourStamps){
        retInfo.code = 1;
    }
    //返回数据
    return retInfo;
}

//起始时间
var beginHour = 22;
//结束时间
var endHour = 19;
//指定时间
var targetHour = 3;
//小时时间信息
var hourStampsInfo = isTargetHourArea(beginHour, endHour, targetHour);
//验证成功
if(hourStampsInfo.code == 1){
    console.log("目标时间:%d 在%d-%d区间内!",targetHour,beginHour,endHour);
}
else{
    console.log("目标时间:%d 不在%d-%d区间内!",targetHour,beginHour,endHour);
}
//输出日志
console.log("起始时间信息 beginHour=%d stamps=%d strHour=%s",beginHour, hourStampsInfo.beginHourStamps, hourStampsInfo.strBeginHourStamps);
console.log("结束时间信息 endHour=%d stamps=%d strHour=%s",endHour, hourStampsInfo.endHourStamps, hourStampsInfo.strEndHourStamps);
console.log("目标时间信息 targetHour=%d stamps=%d strHour=%s",targetHour, hourStampsInfo.targetHourStamps, hourStampsInfo.strTargetHourStamps);

以上代码的输出结果:

目标时间:3 在22-19区间内!
demo.js:156
起始时间信息 beginHour=22 stamps=1575986400000 strHour=2019-12-10 22:0:0:0
demo.js:162
结束时间信息 endHour=19 stamps=1576062000000 strHour=2019-12-11 19:0:0:0
demo.js:163
目标时间信息 targetHour=3 stamps=1576004400000 strHour=2019-12-11 3:0:0:0

以上代码实现了针对小时区间的验证,稍加改动,可扩展出对分秒毫的验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的大象

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值