You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中判断时间范围是否包含另一个时间范围的问题求助

解决时间范围包含判断的问题

你的核心问题是判断逻辑完全写反了,同时需要兼容跨天时间范围的场景。以下是修正后的方案:

问题分析

你需要判断加班时间范围是否包含夜班时间范围,但当前代码的逻辑是判断「加班时间是否被夜班包含」,导致结果完全错误。此外,当夜班是跨天范围时(如22:00今日到06:00明日),需要适配这种特殊场景的判断逻辑。

修正后的代码

function isOvertimeCoversNightShift($overTimeStart, $overTimeEnd) {
    $nightShiftStart = strtotime("22:00:00 today");
    $nightShiftEnd = strtotime("06:00:00 tomorrow");
    
    // 判断夜班是否为跨天范围(开始时间戳大于结束时间戳)
    $nightCoversMidnight = $nightShiftStart > $nightShiftEnd;
    
    if ($nightCoversMidnight) {
        // 跨天夜班:加班需覆盖「夜班开始到当日结束」和「次日开始到夜班结束」
        return $overTimeStart <= $nightShiftStart && $overTimeEnd >= $nightShiftEnd;
    } else {
        // 非跨天夜班:夜班的起止时间需全部落在加班范围内
        return $overTimeStart <= $nightShiftStart && $overTimeEnd >= $nightShiftEnd;
    }
}

// 测试用例1:加班21:00今日至07:00明日
$overTime1Start = strtotime("21:00:00 today");
$overTime1End = strtotime("07:00:00 tomorrow");
var_dump(isOvertimeCoversNightShift($overTime1Start, $overTime1End)); // 输出bool(true)

// 测试用例2:加班17:00今日至20:00今日
$overTime2Start = strtotime("17:00:00 today");
$overTime2End = strtotime("20:00:00 today");
var_dump(isOvertimeCoversNightShift($overTime2Start, $overTime2End)); // 输出bool(false)

逻辑说明

  1. 跨天判断:通过比较夜班开始和结束的时间戳,识别是否为跨天范围($nightShiftStart > $nightShiftEnd)。
  2. 包含判断:
    • 核心逻辑统一为加班开始时间 ≤ 夜班开始时间,且加班结束时间 ≥ 夜班结束时间,这是确保夜班全时段被加班覆盖的必要条件。
    • 对于跨天夜班,该逻辑依然有效:加班结束时间为次日时间,时间戳必然大于夜班结束时间(当日早间),只要加班开始早于夜班开始,就能完整覆盖跨天的夜班区间。

内容的提问来源于stack exchange,提问作者Ainz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:05:14