时间安排和时间表 php 条件

Timings and Schedule php condition

我有一个像

这样的数组
            $array = (
                0 => array(
                    "start" => "Mon 09:30",
                    "end" => "Mon 11:00"
                ) ,
                1 => array(
                    "start" => "Sun 14:10",
                    "end" => "Sun 20:00"
                ) ,
                array(
                    "start" => "Sun 07:30",
                    "end" => "Sun 08:00"
                ));

有没有想过只有当前时间在这个时间内才执行一个功能

如果当前时间在开始和结束回显之间或return为真。日期不重要

这是一个解决方案,但是,不要忘记调整您的网络时区。事实上,您甚至不需要任何 strtotime()。

<?php
$dateRanges = array(
    0 => array(
        "start" => "Mon 09:30",
        "end" => "Mon 11:00"
    ),
    1 => array(
        "start" => "Sun 14:10",
        "end" => "Sun 20:00"
    ),
    2 => array(
        "start" => "Sun 07:30",
        "end" => "Sun 08:00"
    )
);

function checkIfItIsNow($dateRanges){
    $now = date('D H:i');
    $result = false;
    foreach ($dateRanges as $range) {
        if(($now > $range['start']) && ($now < $range['end'])){
            $result = true;
            break;
        }
    }
    return $result;
}

$finalResult = checkIfItIsNow($dateRanges);
var_dump($finalResult);
?>

如果您有任何问题,请告诉我。

为时间范围子数组中的每个值创建日期时间对象对于您的任务来说是不必要的开销。 strtotime() 只给你所需要的。

作为最佳实践,您应该在找到符合条件的时间范围后尽早执行 return -- 这样您的代码就不会执行无用的迭代。

代码:(Demo)

$array = [
    ["start" => "Mon 09:30", "end" => "Mon 11:00"],
    ["start" => "Sun 14:10", "end" => "Sun 20:00"],
    ["start" => "Sun 07:30", "end" => "Sun 08:00"],
    ["start" => "Sun 08:30", "end" => "Sun 09:30"]
];

function in_range($array) {
    $now = time();  // using server timezone
    echo date("D H:i") , "\n";
    foreach ($array as $range) {
        if ($now >= strtotime($range["start"]) && strtotime($range["end"]) >= $now) {
            return $range;  // or true if you like
        }
    }
    return false;
}

var_export(in_range($array));

输出(此时):

Sun 09:02
array (
  'start' => 'Sun 08:30',
  'end' => 'Sun 09:30',
)

如果不同的日期名称不可能出现在同一行数据中,那么您可以通过删除查找数组中的冗余来进一步优化查找过程。

如果您重组白天行以按日期分组并将该值用作关联的第一级键,则可以使用 isset() 提供快速 return 而无需任何时间比较并消除无用地重复一周中所有其他日子的机会。

代码:(Demo)

$array = [
    "Mon" => [
        ["start" => "09:30", "end" => "11:00"]
    ],
    "Sun" => [
        ["start" => "07:30", "end" => "08:00"],
        ["start" => "08:30", "end" => "09:30"],
        ["start" => "14:10", "end" => "23:59"]
    ]
];

function in_range($array) {
    $dayname = date("D");
    if (!isset($array[$dayname])) {
        return false;  // quick, 1st level return
    }
    $now = date("H:i");
    foreach ($array[$dayname] as $range) {
        if ($now >= $range["start"] && $range["end"] >= $now) {
            return true;  // quick return
        }
    }
    return false;  // fallback return after iterating the dayname group
}

var_export(in_range($array));

这可能是过早的优化。我不知道你的项目的规模和范围。我只是想提一下,以防未来研究人员的项目可以从中受益。