首先阐述下具体的需求,举例有如下几个时间段:
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
以上代码实现了针对小时区间的验证,稍加改动,可扩展出对分秒毫的验证。