时间范围减法:从主时间段中移除子时间段

时间范围减法:从主时间段中移除子时间段

本教程旨在解决从一组主时间段中移除特定子时间段的问题。我们将探讨一种实用的javascript算法,通过遍历和条件判断,将重叠的主时间段精确地分割为不包含子时间段的新区间,从而实现时间范围的有效管理和数据清洗

引言:时间段的移除与分割

在数据处理和业务逻辑中,我们经常需要对时间范围进行操作,例如从一个较大的时间段中排除某个特定的子时间段。这种需求在日程管理、资源预订、数据分析等领域尤为常见。本教程将提供一个具体的解决方案,演示如何通过编程实现这一目标,尤其是在子时间段完全包含在主时间段内部的场景。

核心问题分析

假设我们有两组时间范围数据,每组都包含多个具有开始时间和结束时间的对象:

xyz:一组主时间段,代表原始的、完整的可用时间。abc:一组需要从 xyz 中移除的子时间段,代表需要排除的占用时间。

我们的目标是生成一个新的 xyz 数组,其中所有 abc 中定义的冲突时间段都被精确地移除。例如,如果 xyz 中有一个时间段是 [09:00, 18:00],而 abc 中有一个时间段是 [16:30, 17:30],那么最终 xyz 应该变为 [09:00, 16:30] 和 [17:30, 18:00]。

原始数据示例:

var abc = [   {      "start": "2021-11-25 16:30:00",      "end": "2021-11-25 17:30:00"   }];var xyz = [   {      "start": "2021-11-25 09:00:00",      "end": "2021-11-25 18:00:00"   },   {      "start": "2021-11-26 15:00:00",      "end": "2021-11-26 19:00:00"   }];

期望输出示例:

xyz = [   {      "start": "2021-11-25 09:00:00",      "end": "2021-11-25 16:30:00"   },   {      "start": "2021-11-25 17:30:00",      "end": "2021-11-25 18:00:00"   },   {      "start": "2021-11-26 15:00:00",      "end": "2021-11-26 19:00:00"   }];

解决方案设计

解决此问题的核心思路是遍历 xyz 中的每一个时间段,然后针对每一个 xyz 时间段,检查它是否与 abc 中的任何时间段存在冲突。如果存在冲突,并且 abc 时间段完全包含在 xyz 时间段内部,我们就将 xyz 时间段分割成两个新的时间段,从而排除 abc 部分。如果不存在冲突,则 xyz 时间段保持不变。

具体步骤如下:

初始化结果数组:创建一个空数组 newXyz 来存储处理后的时间段。遍历主时间段:对 xyz 数组中的每个时间段进行迭代。时间戳转换:为了方便比较,将所有时间字符串转换为统一的时间戳(例如毫秒数)。冲突检测:对于当前的 xyz 时间段,遍历 abc 数组中的所有时间段。判断 abc 时间段的开始时间是否在 xyz 时间段的开始时间和结束时间之间。这是检测 abc 包含在 xyz 内部的关键条件。时间段分割:如果检测到冲突(即 abc 包含在 xyz 内):将 xyz 时间段从其开始到 abc 的开始时间分割为第一个新时间段。如果 abc 的结束时间也在 xyz 的结束时间之前,则将 xyz 时间段从 abc 的结束时间到 xyz 的结束时间分割为第二个新时间段。标记已检测到冲突,并停止对当前 xyz 时间段的 abc 遍历(因为我们只处理第一个冲突)。无冲突处理:如果遍历完所有 abc 时间段后,当前 xyz 时间段未检测到冲突,则将其原样添加到 newXyz 数组中。更新主数组:最后,将 newXyz 赋值给 xyz。

JavaScript 实现示例

以下是根据上述设计实现的 JavaScript 代码:

var abc = [   {      "start": "2021-11-25 16:30:00",      "end": "2021-11-25 17:30:00"   }];var xyz = [   {      "start": "2021-11-25 09:00:00",      "end": "2021-11-25 18:00:00"   },   {      "start": "2021-11-26 15:00:00",      "end": "2021-11-26 19:00:00"   }];var newXyz = []; // 用于存储处理后的新时间段for (var i in xyz) {  // 将当前 xyz 时间段的开始和结束时间转换为时间戳  var start = new Date(xyz[i]["start"]).getTime();  var end = new Date(xyz[i]["end"]).getTime();  var collisionDetected = false; // 标记是否检测到冲突  for (var j in abc) {    // 将当前 abc 时间段的开始和结束时间转换为时间戳    var start2 = new Date(abc[j]["start"]).getTime();    var end2 = new Date(abc[j]["end"]).getTime();    // 冲突检测条件:    // 如果 abc 的开始时间在 xyz 的开始和结束时间之间    // 这意味着 abc 至少部分地包含在 xyz 内部    if (start2 > start && start2 < end) {      // 添加 xyz 的第一部分:从 xyz 的开始到 abc 的开始      newXyz.push({"start": xyz[i]["start"], "end": abc[j]["start"]});      // 如果 abc 的结束时间也在 xyz 的结束时间之前      // 这意味着 abc 完全包含在 xyz 内部,并且后面还有剩余部分      if (end2 < end) {        // 添加 xyz 的第二部分:从 abc 的结束到 xyz 的结束        newXyz.push({"start": abc[j]["end"], "end": xyz[i]["end"]});      }      collisionDetected = true; // 标记冲突已处理      break; // 针对当前 xyz 时间段,只处理第一个发现的 abc 冲突并跳出内层循环    }  }  // 如果当前 xyz 时间段没有与任何 abc 时间段发生冲突  if (collisionDetected == false) {    // 将原始的 xyz 时间段添加到结果中    newXyz.push({"start": xyz[i]["start"], "end": xyz[i]["end"]});  }}xyz = newXyz; // 更新 xyz 数组为处理后的结果console.dir(xyz);

代码解析:

时间戳转换:new Date(dateString).getTime() 是将日期字符串转换为自1970年1月1日00:00:00 UTC以来的毫秒数。这种数字形式便于进行大小比较。外层循环:for (var i in xyz) 遍历 xyz 数组中的每一个主时间段。内层循环:for (var j in abc) 遍历 abc 数组中的每一个要移除的子时间段,与当前 xyz 时间段进行比较。冲突条件:if (start2 > start && start2 分割逻辑:如果满足冲突条件,首先将 xyz 时间段的前半部分 [xyz.start, abc.start] 加入 newXyz。接着,if (end2 break 语句:在检测到并处理了第一个冲突后,break 语句会立即跳出内层循环。这意味着对于一个 xyz 时间段,如果它与多个 abc 时间段重叠,此代码只会处理第一个发现的 abc 冲突。无冲突处理:if (collisionDetected == false) 确保那些未与任何 abc 时间段冲突的 xyz 时间段被完整地保留下来。

注意事项与扩展

特定冲突场景:当前解决方案主要针对 abc 时间段完全包含在 xyz 时间段内部,并且 abc 的起始点在 xyz 内部的场景。它能够正确处理示例中的情况。更复杂的重叠情况部分重叠:例如 abc 从 xyz 的左侧开始重叠 (abc.start 完全包含:abc 完全包含 xyz (abc.start = xyz.end)。多重冲突:一个 xyz 时间段与多个 abc 时间段重叠。当前代码中的 break 语句意味着它只处理一个 xyz 时间段的第一次 abc 冲突。对于需要处理所有重叠并进行复杂区间合并或减法的场景,需要更通用的区间算法(例如,先将所有区间排序,然后进行合并或减法操作)。日期库的使用:在实际项目中,推荐使用成熟的日期处理库,如 Moment.js (legacy) 或 date-fns (modern),它们提供了更健壮和易用的日期解析、格式化和比较功能,可以避免原生 Date 对象在不同浏览器和时区下可能出现的细微差异。性能考量:对于大规模时间段数据,嵌套循环的性能开销会随着数据量增加而显著上升。如果性能成为瓶颈,可以考虑对时间段进行预排序,然后采用更高效的算法(例如扫描线算法)来处理重叠和合并问题。

总结

本教程提供了一个在 JavaScript 中从一组主时间段中移除特定子时间段的实用方法。通过将日期字符串转换为时间戳,并利用嵌套循环和条件判断,我们能够有效地识别并分割重叠的时间段,从而生成符合需求的新时间段集合。虽然此方案专注于处理子时间段完全包含在主时间段内部的特定场景,但其核心逻辑为理解更复杂的时间范围操作奠定了基础。在实际应用中,根据具体业务需求和数据规模,可能需要进一步扩展或优化算法以应对更多样化的时间段重叠模式。

以上就是时间范围减法:从主时间段中移除子时间段的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1327095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP-FPM Docker容器意外输出POST数据:安全加固与解决方案
上一篇 2025年12月12日 13:27:42
Laravel中自定义Rule::in验证规则的错误消息
下一篇 2025年12月12日 13:27:49

相关推荐

  • 强烈推荐3个超级棒的app

    强烈推荐3个超级棒的app强烈推荐3个超级棒的app强烈推荐3个超级棒的app强烈推荐3个超级棒的app

    hello 大家好! 前几天给大家分享了几款非常实用的软件,每一款都特别有用。 正文 1、Edge app:说到浏览器,谷歌浏览器可以说是最受欢迎的之一。但在国内使用谷歌浏览器就有些麻烦了,因为无法正常访问谷歌服务。要么你有特殊方法,要么只能用谷歌的壳,里面却是百度。在国内使用最多的浏览器应该是IE…

    2026年9月1日 用户投稿
    200
  • 详解MySql Group by函数真正的打开方法!

    本篇文章给大家介绍mysql group by 函数的正确打开方式,希望对大家有帮助! MySql Group by 函数的正确打开方式 在使用分组函数时, 进行结果集筛选, 遇到的一些问题以及解决办法【推荐:mysql视频教程】 1. 应用场景 有两张表 文章表(一对多留言表) t_posts: …

    用户投稿 2026年9月1日
    000
  • Linux下Apache安装PHP指南

    Linux下Apache安装PHP指南Linux下Apache安装PHP指南Linux下Apache安装PHP指南Linux下Apache安装PHP指南

    已成功下载PHP最新版本7.4.2的源码包,接下来进行解压操作以便进入编译准备阶段。 立即学习“PHP免费学习笔记(深入)”; 确认Apache安装路径中的apxs工具位置,通常位于/usr/local/apache/bin/apxs,该工具将在后续模块集成中起关键作用。 进入解压后的php-7.4…

    2026年9月1日 用户投稿
    000
  • Java方法重载与重写有什么区别 如何合理使用

    方法重载发生在同一类中,方法名相同但参数列表不同,用于提供多种调用方式;方法重写发生在子类继承父类时,方法名、参数列表和返回类型必须一致,用于改变父类方法的实现。 方法重载(Overload)和重写(Override)是Java中实现多态的两种重要机制,它们虽然都涉及方法名的重复使用,但应用场景和规…

    2026年9月1日
    000
  • UC浏览器如何录制视频

    UC浏览器如何录制视频UC浏览器如何录制视频UC浏览器如何录制视频UC浏览器如何录制视频

    然后我们打开uc浏览器,并使用百度搜索殷勤随便找一个视频 我们找到一个关于XX和XX的明星八卦视频,(*好不要广告的,这样更节省时间) 接着点击右上角UC的图标,会看到一个视频录制按钮,我们需要点击一下,它就会开始计时记录。 我们可以看到录制区域有一个时间显示,如果想结束录制,只需再点击一次即可。 …

    2026年9月1日 用户投稿
    100
  • 163邮箱的POP3和IMAP是什么_163邮箱协议类型与区别

    163邮箱支持POP3和IMAP两种协议,IMAP实现多设备同步,适合跨设备用户;POP3将邮件下载至本地,适合单设备使用。需先在网页端开启对应服务,再按服务器地址、端口及加密方式配置客户端。 如果您在设置163邮箱的客户端(如Outlook、Foxmail或手机邮件应用)时,遇到需要选择POP3或…

    2026年9月1日
    000
  • 原生JS如何实现表格滚动吸附,精确控制行列显示隐藏?

    原生JS实现表格滚动吸附:精确控制行列显示隐藏 本文探讨如何使用原生JavaScript精确控制表格滚动,实现类似Excel表格的滚动吸附效果,即每次滚动精确隐藏或显示一行或一列。 这需要超越浏览器默认滚动行为,对滚动事件进行更精细的控制。 核心在于“滚动吸附”机制。 不同于CSS实现的滚动吸附,这…

    2026年9月1日
    000
  • 360浏览器如何保存账号密码 保存账号密码方法

    360浏览器如何保存账号密码 保存账号密码方法360浏览器如何保存账号密码 保存账号密码方法360浏览器如何保存账号密码 保存账号密码方法360浏览器如何保存账号密码 保存账号密码方法

    双击或右键点击桌面的360安全浏览器图标启动程序; 点击浏览器右上角的“登录关机”按钮; 点击设置图标进入浏览器设置界面; 若需添加新的网站账号信息,请点击“添加”按钮; 填写网站名称、网址、用户名和密码,确认无误后点击确定完成添加; 对于已保存过账号的网站,如需新增账户信息,只需选择对应网站并点击…

    2026年9月1日 用户投稿
    000
  • uc浏览器如何恢复删掉浏览历史 怎么查找uc删除浏览历史记录

    uc浏览器是目前很多人常用的网页浏览工具,这款软件功能十分全面,用户想要获取的各种信息都可以直接呈现出来,丰富的功能完全能够满足大家不同的上网需求,随时都能享受流畅的上网体验。平时浏览的记录在默认情况下都会被保存下来,方便日后再次查看,实用性非常强。但如果不小心误删了这些浏览记录,该如何恢复呢?不清…

    2026年9月1日
    000
  • UC浏览器打开就闪退怎么办_UC浏览器闪退解决方法

    首先重启设备并关闭后台应用,若仍闪退则清除UC浏览器缓存与数据,接着更新或重装应用,检查并删除特定异常文件如WeatherInfoV1,最后确保系统更新且存储空间充足。 如果您在打开UC浏览器时立即遇到应用崩溃或闪退,这可能是由于软件冲突、缓存数据异常或系统兼容性问题导致的。以下是解决此问题的具体步…

    2026年9月1日
    100
  • oTranCe翻译平台的使用与替代方案

    可以通过一下地址学习composer:学习地址 oTranCe曾是许多开发者和翻译人员的得力助手,它提供了一个完全基于web的翻译平台,方便用户直接在浏览器中进行翻译工作。它的主要特点包括: 基于web:通过浏览器即可进行翻译,无需安装额外的软件。导入导出:可以轻松导入已翻译的文件,并在任何时间导出…

    用户投稿 2026年9月1日
    000
  • 谷歌浏览器缓存怎么清除 谷歌浏览器删除及转移方法分享

    谷歌浏览器在使用过程中会产生大量缓存文件,这虽然能加速网页加载,但长期累积可能导致浏览器运行变慢、占用系统盘空间。本文将为您详细介绍三种处理谷歌浏览器缓存的方法,包括常规的清理、彻底的手动删除,以及将缓存文件夹转移到其他磁盘的技巧,帮助您根据不同需求有效管理浏览器缓存。 立即进入“高清国产电影网站合…

    2026年9月1日
    100
  • PC端和响应式H5项目适配:如何兼顾效率和用户体验?

    跨平台网页开发:PC端与响应式H5项目的最佳适配策略 许多开发者精通响应式H5的适配技巧,例如运用PostCSS插件(如postcss-pxtorem或postcss-px-to-viewport), 通常基于iPhone 6设计稿。但PC端网页适配策略却大相径庭。本文将探讨PC端网页适配方案,以及…

    2026年9月1日
    300
  • 谷歌浏览器怎么清理缓存 怎么清理谷歌浏览器缓存

    谷歌浏览器在日常使用中会保存大量网站的缓存数据,例如图片和脚本,以提升后续访问的加载速度。但缓存文件过多有时会导致网页显示不正确、占用过多磁盘空间等问题。本文将为您提供一份清晰的指南,分步骤讲解如何清理谷歌浏览器的缓存,让您能够轻松完成操作,优化浏览器性能。 立即进入“高清国产电影网站合集☜☜☜☜☜…

    2026年9月1日
    200
  • 如何清除谷歌浏览器缓存?简单几步,让你的电脑运行如飞!

    随着使用时间的增长,谷歌浏览器会存储大量的网站缓存,这虽然能加快网页加载,但过多的缓存文件不仅会占用宝贵的磁盘空间,还可能导致浏览器运行卡顿、页面显示异常。本文将通过简单明了的步骤,指导您如何有效清理谷歌浏览器的缓存,从而帮助您的浏览器乃至电脑恢复流畅的运行状态,提升整体使用体验。 立即进入“高清国…

    2026年9月1日
    500
  • 如何强制刷新谷歌浏览器缓存 怎么清理谷歌浏览器所有缓存垃圾

    谷歌浏览器在日常使用中会累积大量的缓存数据,这些文件虽然可以加快网页加载速度,但长期堆积也可能导致浏览器性能下降或页面显示错误。本文将为您详细介绍两种清除谷歌浏览器缓存的方法:一种是针对特定页面的强制刷新,另一种是彻底清理所有缓存垃圾的步骤,帮助您有效地管理和优化浏览器性能。 立即进入“高清国产电影…

    2026年9月1日
    600
  • Java Stream.flatMap方法处理嵌套集合

    flatMap可将嵌套集合展平为单一流,通过将每个元素转换为流并合并结果,实现一对多映射。例如,二维字符串列表经flatMap处理后得到单一字符串列表;在对象集合中,如学生含课程列表,可通过flatMap提取所有课程并去重;对于多层结构(学校→班级→学生→课程),可连续使用flatMap逐层展开,最…

    2026年9月1日
    200
  • VSCode标签怎么自动补齐_VSCodeHTML/XML标签自动补全设置教程

    答案:VSCode中HTML/XML标签自动补齐失效通常由Emmet未启用、文件类型识别错误或设置冲突导致。需检查emmet.triggerCharacters和editor.quickSuggestions设置,确认文件语言模式正确,并确保emmet.includeLanguages配置合理。同时…

    2026年9月1日
    100
  • qq手机浏览器如何关闭安全模式 手机qq浏览器安全防护怎么关闭

    qq手机浏览器如何关闭安全模式 手机qq浏览器安全防护怎么关闭qq手机浏览器如何关闭安全模式 手机qq浏览器安全防护怎么关闭qq手机浏览器如何关闭安全模式 手机qq浏览器安全防护怎么关闭qq手机浏览器如何关闭安全模式 手机qq浏览器安全防护怎么关闭

    为您介绍如何关闭手机qq浏览器的安全防护功能。在使用手机qq浏览器时,有时候安全防护功能可能会影响您的浏览体验,因此关闭该功能或许会是一个更好的选择。接下来,请跟随我们了解具体的操作步骤。 手机QQ浏览器轻松关闭安全防护教程一览 1、打开手机QQ浏览器,切换至“我的”页面。 2、点击右上角的“设置”…

    2026年9月1日 用户投稿
    300
  • Via浏览器有同步吗 Via浏览器怎么设置同步

    via浏览器开启云同步功能的操作流程: 1、Via浏览器内置了云同步服务,当用户更换设备时,只需在新手机上重新安装Via浏览器,进入主页后点击右上角的横杠图标,进入“设置”界面。 2、随后在设置菜单中找到并点击“通用”选项,这里即可看到“云同步”功能,启用该功能便可开始信息同步。 3、接着,用户只需…

    2026年9月1日
    100

发表回复

登录后才能评论
关注微信