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)
逻辑说明
- 跨天判断:通过比较夜班开始和结束的时间戳,识别是否为跨天范围(
$nightShiftStart > $nightShiftEnd)。 - 包含判断:
- 核心逻辑统一为加班开始时间 ≤ 夜班开始时间,且加班结束时间 ≥ 夜班结束时间,这是确保夜班全时段被加班覆盖的必要条件。
- 对于跨天夜班,该逻辑依然有效:加班结束时间为次日时间,时间戳必然大于夜班结束时间(当日早间),只要加班开始早于夜班开始,就能完整覆盖跨天的夜班区间。
内容的提问来源于stack exchange,提问作者Ainz
相关产品推荐
相关产品推荐

