时间点的验证需要考虑跨天的情况:
下面分别列举2种情况,
情况1:验证凌晨3点,是否在22点~19点这个区间。
跨天的情况下,22点~19点的时间点,分别为:22,23,24,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19。
可以看到3点在22点~19点的区间。
情况 2:验证凌晨3点是否在22点~2点这个区间。
跨天的情况下,22点~2点的区间,分别为:22,23,24,1,2
可以看到3点不在22点~2点的区间。
基于上面的需求,实现代码如下:
/**
* 获取当前时间戳(毫秒)
*/
function getNowMilliSecond(){
return Math.floor(Date.now());
}
/**
* 获取当前时间戳(秒)
*/
function getNowSceond(){
return Math.floor(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 = getNowSceond();
//获取时间信息
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=22 stamps=1608040800000 strHour=2020-12-15 22:0:0:0
beginHour,
hourStampsInfo.beginHourStamps,
hourStampsInfo.strBeginHourStamps);
console.log("结束时间信息 endHour=%d stamps=%d strHour=%s", //输出:结束时间信息 endHour=19 stamps=1608116400000 strHour=2020-12-16 19:0:0:0
endHour,
hourStampsInfo.endHourStamps,
hourStampsInfo.strEndHourStamps);
console.log("目标时间信息 targetHour=%d stamps=%d strHour=%s", //输出:目标时间信息 targetHour=3 stamps=1608058800000 strHour=2020-12-16 3:0:0:0
targetHour,
hourStampsInfo.targetHourStamps,
hourStampsInfo.strTargetHourStamps);