如何判断两个时间点是否完全落在指定时间段内

发布时间 - 2026-01-06 00:00:00    点击率:

本文详解如何准确判断起止两个时间点是否都位于给定的时间范围内,指出常见逻辑错误(如混淆“包含”与“重叠”),并使用 php datetime 类提供健壮、可读性强的解决方案。

在开发排课系统、预约管理或工时校验等场景中,一个高频需求是:判断某段持续时间(例如从 9:00 到 11:15)是否完全处于某个允许的时间窗口内(例如 9:00–10:00)。注意,这里的关键是“完全处于”——即该时间段的起点和终点都必须落在窗口的闭区间内(含边界)。

但许多开发者会误用逻辑条件,例如原问题中的代码:

if ((($hdebut >= $ihdebutcours) && ($hdebut <= $ihfincours)) 
 && (($hfin >= $ihdebutcours) && ($hfin >= $ihfincours))) {
    $f++;
}

第二组条件 ($hfin >= $ihdebutcours) && ($hfin >= $ihfincours) 存在明显错误:它实际要求结束时间 大于等于窗口起始且大于等于窗口结束,即 hfin ≥ max(窗口起, 窗口止),这等价于仅校验 hfin ≥ 窗口结束,却遗漏了「hfin 不能超过窗口结束」这一核心约束——正确逻辑应为 hfin

✅ 正确的完整判定条件是:

$hdebut ≥ 窗口开始 且 $hdebut ≤ 窗口结束 且 $hfin ≥ 窗口开始 且 $hfin ≤ 窗口结束 等价于:整个区间 [$hdebut, $hfin] ⊆ [$ihdebutcours, $ihfincours]

推荐使用 PHP 的 DateTime 类进行时间比较,它天然支持对象化比较(无需 strtotime() 转整型),语义清晰、时区安全、不易出错:

= $windowStart && $start <= $windowEnd 
 && $end   >= $windowStart && $end   <= $windowEnd) {
    $f++;
    echo "✅ 完全包含:{$hdebut}–{$hfin} 在 {$ihdebutcours}–{$ihfincours} 内";
} else {
    echo "❌ 不满足:至少一端超出窗口范围";
}

? 注意事项

  • 若涉及跨日(如 '23:00' 到 '01:00'),需显式指定日期或使用 DateInterval 处理;纯当日时间比较时,DateTime('9:00') 默认解析为当天,安全可用。
  • 避免用 strtotime() 后整数比较:易受时区/夏令时影响,且可读性差(如 1712345678
  • 如需判断「是否重叠」(而非「是否包含」),逻辑完全不同,应使用:$start windowEnd && $end >= $windowStart。

? 进阶建议:可封装为复用函数:

function isFullyInRange(string $start, string $end, string $rangeStart, string $rangeEnd): bool {
    $s = new DateTime($start);
    $e = new DateTime($end);
    $rs = new DateTime($rangeStart);
    $re = new DateTime($rangeEnd);
    return $s >= $rs && $e <= $re;
}

// 使用示例
var_dump(isFullyInRange('9:00', '9:45', '9:00', '10:00')); // true
var_dump(isFullyInRange('9:00', '10:30', '9:00', '10:00')); // false

用 DateTime 替代原始时间戳运算,不仅修复逻辑缺陷,更让代码具备自解释性、可维护性与长期稳定性。


# php  # windows  # win  # 封装  # 整型  # 对象  # 进阶  # 这一  # 区间内  # 推荐使用  # 落在  # 而非  # 如需  # 这等  # 不能超过  # 更让 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 大连 网站制作,大连天途有线官网?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何在IIS服务器上快速部署高效网站?  使用spring连接及操作mongodb3.0实例  进行网站优化必须要坚持的四大原则  简历在线制作网站免费版,如何创建个人简历?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  ,怎么在广州志愿者网站注册?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  JS去除重复并统计数量的实现方法  高端云建站费用究竟需要多少预算?  如何用腾讯建站主机快速创建免费网站?  香港服务器部署网站为何提示未备案?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何快速查询域名建站关键信息?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  实例解析angularjs的filter过滤器  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  详解jQuery中基本的动画方法  音乐网站服务器如何优化API响应速度?  Android自定义控件实现温度旋转按钮效果  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何构建满足综合性能需求的优质建站方案?  Windows Hello人脸识别突然无法使用  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何彻底卸载建站之星软件?  Laravel安装步骤详细教程_Laravel环境搭建指南  网站建设整体流程解析,建站其实很容易!  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何在万网利用已有域名快速建站?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  如何有效防御Web建站篡改攻击?  高防服务器租用如何选择配置与防御等级?  如何为不同团队 ID 动态生成多个非值班状态按钮  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  如何打造高效商业网站?建站目的决定转化率  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel怎么连接多个数据库_Laravel多数据库连接配置  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  黑客入侵网站服务器的常见手法有哪些?  如何在云虚拟主机上快速搭建个人网站?