首页 > 其他分享 >JS实现检查给定时间范围是否在每天的某个时间段内

JS实现检查给定时间范围是否在每天的某个时间段内

时间:2024-04-03 19:48:00浏览次数:19  
标签:20 00 end 04 JS start 给定 时间段 const

// 解析时间字符串,返回对应的分钟数
function parseTime(timeStr) {
    const [hours, minutes] = timeStr.split(':').map(num => parseInt(num));
    return hours * 60 + minutes;
}

// 解析时间字符串,返回对应的 Date 对象
function parseTimeString(timeStr) {
    const match = timeStr.match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})$/);
    if (!match) {
        return null;
    }
    const year = parseInt(match[1]);
    const month = parseInt(match[2]) - 1; // 月份从 0 开始
    const day = parseInt(match[3]);
    const hour = parseInt(match[4]);
    const minute = parseInt(match[5]);
    return new Date(year, month, day, hour, minute);
}

function isOverlapWithProhibitedRanges(startTimeStr, endTimeStr, prohibitedRanges) {
    const startTime = parseTimeString(startTimeStr);
    const endTime = parseTimeString(endTimeStr);

    if (!startTime || !endTime) {
        return false;
    }

    const startDay = startTime.getDay();
    const endDay = endTime.getDay();

    if (startDay === endDay) {
        const startHour = startTime.getHours();
        const startMinute = startTime.getMinutes();
        const endHour = endTime.getHours();
        const endMinute = endTime.getMinutes();

        const startMinutes = startHour * 60 + startMinute;
        const endMinutes = endHour * 60 + endMinute;
        const prohibitedRange = prohibitedRanges[startDay];

        if (prohibitedRange && !(endMinutes <= parseTime(prohibitedRange.start) || startMinutes >= parseTime(prohibitedRange.end))) {
            return true;
        }
    } else {
        let currentDate = new Date(startTime);
        while (currentDate.getDay() !== endDay) {
            const currentDay = currentDate.getDay();
            const currentDayProhibitedRange = prohibitedRanges[currentDay];
            const startHour = currentDate.getHours();
            const startMinute = currentDate.getMinutes();
            const endHour = 23;
            const endMinute = 59;

            const startMinutes = startHour * 60 + startMinute;
            const endMinutes = endHour * 60 + endMinute;

            if (currentDayProhibitedRange && !(endMinutes <= parseTime(currentDayProhibitedRange.start) || startMinutes >= parseTime(currentDayProhibitedRange.end))) {
                return true;
            }

            currentDate.setDate(currentDate.getDate() + 1);
            currentDate.setHours(0, 0, 0, 0);
        }

        const currentDay = currentDate.getDay();
        const currentDayProhibitedRange = prohibitedRanges[currentDay];
        const startHour = currentDate.getHours();
        const startMinute = currentDate.getMinutes();
        const endHour = endTime.getHours();
        const endMinute = endTime.getMinutes();

        const startMinutes = startHour * 60 + startMinute;
        const endMinutes = endHour * 60 + endMinute;

        if (currentDayProhibitedRange && !(endMinutes <= parseTime(currentDayProhibitedRange.start) || startMinutes >= parseTime(currentDayProhibitedRange.end))) {
            return true;
        }
    }

    return false;
}

// 示例用法
const startTime = "2024-04-06 03:00";
const endTime = "2024-04-06 04:01";

const prohibitedRanges = [
    { start: "10:00", end: "22:00" }, // 周日
    { start: "08:00", end: "20:00" }, // 周一
    { start: "08:00", end: "20:00" }, // 周二
    { start: "08:00", end: "20:00" }, // 周三
    { start: "08:00", end: "20:00" }, // 周四
    { start: "08:00", end: "20:00" }, // 周五
    { start: "10:00", end: "22:00" }  // 周六
];

function test123(startTime, endTime, prohibitedRanges){
	if (isOverlapWithProhibitedRanges(startTime, endTime, prohibitedRanges)) {
		console.log("给定的时间范围与禁止的时间范围有重合。");
		console.log("Fail");
	} else {
		console.log("给定的时间范围与禁止的时间范围没有重合。");
		console.log("Pass");
	}
}
test123("2024-04-06 03:00", "2024-04-06 04:01", prohibitedRanges);//周六,Pass
test123("2024-04-06 10:00", "2024-04-06 20:00", prohibitedRanges);//周六,Fail
test123("2024-04-05 03:00", "2024-04-05 04:01", prohibitedRanges);//周五,Pass
test123("2024-04-05 10:00", "2024-04-05 20:00", prohibitedRanges);//周五,Fail
test123("2024-04-05 10:00", "2024-04-06 20:00", prohibitedRanges);//跨天,Fail
test123("2024-04-05 10:00", "2024-04-08 20:00", prohibitedRanges);//跨天,Fail


function convertTimezone(schedule, offset) {
    // 函数用于将时间从一个时区转换到另一个时区
    function convertTime(time, offset) {
        const [hour, minute] = time.split(':').map(Number);
        let totalMinutes = hour * 60 + minute;
        totalMinutes += offset * 60; // 将小时偏移转换为分钟偏移
        if (totalMinutes < 0) {
            totalMinutes += 24 * 60;
        } else if (totalMinutes >= 24 * 60) {
            totalMinutes -= 24 * 60;
        }
        const newHour = Math.floor(totalMinutes / 60) % 24;
        const newMinute = (totalMinutes % 60).toString().padStart(2, '0');
        return `${newHour.toString().padStart(2, '0')}:${newMinute}`;
    }

    // 遍历每一天的时间段,进行时区转换
    const convertedSchedule = schedule.map((timeSlot, index) => {
        const start = convertTime(timeSlot.start, offset);
        const end = convertTime(timeSlot.end, offset);
        return { start, end, weekday: index };
    });

    return convertedSchedule;
}

// 示例用法
const schedule = [
    { start: "10:00", end: "22:00" }, // 周日
    { start: "08:00", end: "20:00" }, // 周一
    { start: "08:00", end: "20:00" }, // 周二
    { start: "08:00", end: "20:00" }, // 周三
    { start: "08:00", end: "20:00" }, // 周四
    { start: "08:00", end: "20:00" }, // 周五
    { start: "10:00", end: "22:00" }  // 周六
];

const convertedSchedule = convertTimezone(schedule, -8.5); // 例如,偏移量 +5 表示向后调整5小时
console.log(convertedSchedule);

标签:20,00,end,04,JS,start,给定,时间段,const
From: https://www.cnblogs.com/yimaoqiandehanboge/p/18113389

相关文章

  • Python中处理JSON字段时,和如何将Python对象转换为JSON字符串
    在Python中处理JSON字段时,通常使用内置的json模块。这个模块允许你将Python对象转换为JSON字符串,以及将JSON字符串解析为Python对象。以下是一些常见的JSON字段处理操作:1.将Python对象转换为JSON字符串python复制importjson#定义一个Python字典data={  "name"......
  • 打字动画 Typed.js
    打字动画Typed.js 概述Typed.js是一个JavaScript库,用于在网页上创建打字动画效果。它使您能够模拟打字机或逐字显示文本的效果,从而为用户提供逐渐展示文本的视觉体验。Typed.js提供了丰富的选项和配置,可以自定义打字动画的速度、暂停时间、删除效果等。您可以使用HTM......
  • nodejs守护进程 PM2
    nodejs守护进程PM2 概述PM2是用于Node.js应用程序的生产环境进程管理器,内置负载均衡器。它允许你将应用程序持续运行,无需停机重新加载,并简化常见的系统管理任务。官方网站 Github特性进程管理:PM2可以启动、停止和重启Node.js应用程序进程,确保应用程序一直处于运行......
  • 模板引擎 Handlebars.js
    模板引擎Handlebars.js 概述Handlebars.js是一个简单而强大的JavaScript模板引擎。它允许开发者通过定义模板和数据来生成动态的HTML页面。Handlebars.js基于Mustache模板语法,它提供了一些扩展和增强功能。并且开发者可以创建可重用的模板,并通过将数据传递给模板......
  • 使用 Node.js 连接 MySQL
    使用Node.js连接MySQL 概述当使用Node.js开发Web应用程序时,经常需要与数据库进行交互来存储和检索数据。MySQL 是一个流行的关系型数据库管理系统,它提供了强大的功能和性能。本文将介绍如何使用Node.js连接MySQL数据库,并展示一些常见的操作示例。开始在这里我们将......
  • RobotJS截取屏幕screen.capture踩坑
    RobotJS截取屏幕screen.capture踩坑 调用robot.screen.capture()或robot.screen.capture(0,0,1920,1080),返回的Bitmap对象是色彩格式是BGR色彩,这导致了如果未经处理就直接生成图像,色彩会产生错误,只需将BGR色彩转换成RGB色彩即可。constrobot=require('robotjs');con......
  • 使用NodeJS将数据保存成JSON文件
    使用NodeJS将数据保存成JSON文件 在平时我需要把后端一些object变量保存至本地,可以这样做:constexpress=require("express");constapp=express();constserver=require("http").createServer(app);constfs=require('fs');app.use(express.static("publ......
  • Jmeter使用json提取器进行模糊提取的方法
    根据JsonPath的官方文档:GitHub-json-path/JsonPath:JavaJsonPathimplementation即下图:若需要对既有的json内容进行模糊匹配,需要使用以上多种方式,但是更建议使用正则匹配的方式。 $..results[?(@.name=~/.*CICD/i)].name表示对results中的name值为CICD结尾的内容进行......
  • node.js 代码执行时间的实现
    基础实现//记录开始时间varstartTime=performance.now();//要执行的代码for(leti=0;i<1000;i++){console.log("第"+(i+1)+"次循环");}//记录结束时间varendTime=performance.now();//计算执行时间varexecutionTime=endTime-startTi......
  • vue项目打包发现index.js加载了两次?差别在于请求头purpose:prefetch
    上线后打开f12,开启禁用缓存=>发现index.js加载了两次;6.6M直接双倍流量;一番研究得知:vue-cli打包时,会将一些文件preload和prefetch;(1)preload(预先加载文件)app.jsvendor.js(2)prefetch(闲时加载)index.js/router懒加载独立打包的文件【就是那串注释标明打包在xx模块用的】再者:启......