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

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"
    }
]

问题分析与解决方案

核心问题

  1. 时间差逻辑无效:只对比了和hora_inicio的小时差,既未使用hora_fin,也忽略了分钟/秒的差异,且DateInterval->h的正负仅代表时间先后,无法直接判断是否在时段内。
  2. 字符串比较时间不可靠:周五判断中直接用字符串对比时间,若格式不一致(如缺失前导零)会导致错误判断。
  3. 未匹配目标日期:未判断当前日期是否与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:15:33