PHP判断当前时间是否在JSON配置工作时段的问题求助
问题:PHP判断当前时间是否处于JSON定义的工作时段逻辑错误
我正在编写PHP脚本,需要对比JSON文件中的时间,判断当前时间是否处于工作时段。目前脚本总是进入else分支,无法正确判断是否超出工作时段。
现有代码
时间差计算函数
$diferencia = $this->diferenciaFechas($hora_actual, $value["hora_inicio"]); function diferenciaFechas($horaInicio, $horaFin) { $hora_inicio = new Datetime($horaInicio); $hora_fin = new Datetime($horaFin); $tiempo = $hora_inicio->diff($hora_fin); return $tiempo; }
核心判断逻辑
foreach ($festivos as $value) { if($viernes == "Friday"){ if($hora_actual < $value["hora_inicio_viernes"] || $hora_actual >= $value["hora_fin_viernes"]){ $fuera_horario = true; } }else{ $diferencia = $this->diferenciaFechas($hora_actual, $value["hora_inicio"]); //echo $diferencia->h; if($provincia == $value["localidad"] && $diferencia->h < 0 || $provincia == $value["localidad"] && $diferencia->h > 0){ $fuera_horario = true; $rama = "fuera horario"; }else{ echo $value["localidad"]; echo $value["hora_inicio"] . "<br>"; } } }
JSON数据示例
[ { "cp": "17", "localidad": "Gerona", "fecha": "2022-12-26", "hora_inicio": "09:00:00", "hora_fin": "14:00:00", "hora_inicio_viernes": "09:00:00", "hora_fin_viernes": "14:00:00" }, { "cp": "18", "localidad": "Granada", "fecha": "2022-12-15", "hora_inicio": "12:01:00", "hora_fin": "12:00:00", "hora_inicio_viernes": "09:00:00", "hora_fin_viernes": "14:00:00" }, { "cp": "18", "localidad": "Granada", "fecha": "2023-01-01", "hora_inicio": "09:00:00", "hora_fin": "14:00:00", "hora_inicio_viernes": "09:00:00", "hora_fin_viernes": "14:00:00" }, { "cp": "19", "localidad": "Guadalajara", "fecha": "2022-12-26", "hora_inicio": "09:00:00", "hora_fin": "14:00:00", "hora_inicio_viernes": "09:00:00", "hora_fin_viernes": "14:00:00" } ]
问题分析与解决方案
核心问题
- 时间差逻辑无效:只对比了和
hora_inicio的小时差,既未使用hora_fin,也忽略了分钟/秒的差异,且DateInterval->h的正负仅代表时间先后,无法直接判断是否在时段内。 - 字符串比较时间不可靠:周五判断中直接用字符串对比时间,若格式不一致(如缺失前导零)会导致错误判断。
- 未匹配目标日期:未判断当前日期是否与JSON中的
fecha一致,遍历所有数据会导致逻辑混乱。
修正后的代码
// 获取当前完整日期时间对象 $now = new DateTime(); // 获取当前星期几(英文全称) $currentWeekday = $now->format('l'); foreach ($festivos as $value) { // 先过滤日期不匹配的数据 $targetDate = DateTime::createFromFormat('Y-m-d', $value["fecha"]); if ($targetDate->format('Y-m-d') !== $now->format('Y-m-d')) { continue; } // 过滤地区不匹配的数据 if ($provincia !== $value["localidad"]) { continue; } // 根据星期几选择对应的时段 if ($currentWeekday === "Friday") { $start = DateTime::createFromFormat('Y-m-d H:i:s', $value["fecha"] . ' ' . $value["hora_inicio_viernes"]); $end = DateTime::createFromFormat('Y-m-d H:i:s', $value["fecha"] . ' ' . $value["hora_fin_viernes"]); } else { $start = DateTime::createFromFormat('Y-m-d H:i:s', $value["fecha"] . ' ' . $value["hora_inicio"]); $end = DateTime::createFromFormat('Y-m-d H:i:s', $value["fecha"] . ' ' . $value["hora_fin"]); } // 判断是否超出工作时段 if ($now < $start || $now >= $end) { $fuera_horario = true; $rama = "fuera horario"; } else { echo $value["localidad"] . '<br>'; echo $value["hora_inicio"] . '<br>'; } }
关键改进点
- 前置过滤无效数据:先匹配日期和地区,减少不必要的计算
- 完整DateTime对象比较:将日期与时间拼接成完整时间对象,确保时间对比准确
- 直接判断时间范围:用
$now < $start || $now >= $end清晰判断是否超出时段
内容的提问来源于stack exchange,提问作者scorpions78
相关产品推荐
相关产品推荐

