У меня есть система, которая принимает заявки пользователей, и после получения представления система будет проходить через все временные интервалы, чтобы найти соответствующий временной интервал. Проблема в том, что она должна иметь возможность проверять время начала и окончания, если конечное время заканчивается на следующий день.
Возьмем следующий пример: временной интервал начинается в 22:30 в текущий день и заканчивается в 16:00 на следующий день. Если текущее время находится между 10:30 PM и 11:59:59 PM, представление будет присвоено этому временному интервалу. Однако, если текущее время находится между 12:00 AM и 4:00 PM, тогда оно пропустит временной интервал.
Это то, что у меня есть до сих пор:
function check_time($from, $to, $time) { $time = strtotime($time); $from = strtotime($from); $to_ = strtotime($to); $to = $to_ <= $from ? strtotime($to . " tomorrow") : $to_; return ($time >= $from && $time <= $to); } $timeslots = array( array("16:00:00", "22:30:00"), array("22:30:00", "16:00:00") ); foreach ($timeslots as $slot) { if (check_time($slot[0], $slot[1], date("H:i:s"))) { echo "true\n"; } else { echo "false\n"; } }
Если текущее время равно 23:00:00, результат будет
false true
Но если текущее время равно 12:00:00, тогда результат будет
false false
хотя это технически между двумя моментами.
Я знаю, что это связано с тем, что если это новый день, то результат strtotime
для $from
будет позже в тот же день. Поэтому вместо того, чтобы вчера проверить на 10:30 вечера, он проверяет сегодня на 10:30 вечера.
Моя проблема заключается в том, что я не могу придумать способ сделать $from
переключения времени до предыдущего дня, если это необходимо, подобно тому, как я заставляю $to
время на следующий день.
Это намного проще, чем вы ожидаете. Предположим, что у вас есть три раза: t1
, t2
и tn
которые представляют соответственно время от пользователя и пользователя. Относитесь к этим шестизначным числам (от 000000 до 235959) и проверьте:
t1
и t2
присутствуют на одной стороне границы полуночи
tn
между t1
и t2
tn
между t2
и t1
Код и тесты:
function check_time($t1, $t2, $tn) { $t1 = +str_replace(":", "", $t1); $t2 = +str_replace(":", "", $t2); $tn = +str_replace(":", "", $tn); if ($t2 >= $t1) { return $t1 <= $tn && $tn < $t2; } else { return ! ($t2 <= $tn && $tn < $t1); } } $tests = array( array("16:00:00", "22:30:00", "15:00:00"), array("16:00:00", "22:30:00", "16:00:00"), array("16:00:00", "22:30:00", "22:29:59"), array("16:00:00", "22:30:00", "22:30:00"), array("16:00:00", "22:30:00", "23:59:59"), array("22:30:00", "16:00:00", "22:29:59"), array("22:30:00", "16:00:00", "22:30:00"), array("22:30:00", "16:00:00", "15:59:59"), array("22:30:00", "16:00:00", "16:00:00"), array("22:30:00", "16:00:00", "17:00:00") ); foreach($tests as $test) { list($t1, $t2, $t0) = $test; echo "$t1 - $t2 contains $t0: " . (check_time($t1, $t2, $t0) ? "yes" : "no") . "\n"; } // OUTPUT // // 16:00:00 - 22:30:00 contains 15:00:00: no // 16:00:00 - 22:30:00 contains 16:00:00: yes // 16:00:00 - 22:30:00 contains 22:29:59: yes // 16:00:00 - 22:30:00 contains 22:30:00: no // 16:00:00 - 22:30:00 contains 23:59:59: no // 22:30:00 - 16:00:00 contains 22:29:59: no // 22:30:00 - 16:00:00 contains 22:30:00: yes // 22:30:00 - 16:00:00 contains 15:59:59: yes // 22:30:00 - 16:00:00 contains 16:00:00: no // 22:30:00 - 16:00:00 contains 17:00:00: no
function check_time($time, $threshold){ $times = array(&$time, &$threshold); foreach($times as &$ts){ if(!preg_match('~^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$~', $ts)){ return false; } $ts = intval(preg_replace('~[^0-9]+~', null, $ts)); } return ($time >= $threshold) ? 2 : 1; } var_dump(check_time(date("H:i:s"), '12:00:00'));
Я обманул! Давайте следовать логике:
$time
вы хотите проверить, и сделал это целым числом. $threshold
который является датой, которая разбивает пробелы в слотах. $time
до или после $threshold
. Если он терпит неудачу (неудачный ввод), он returns false
. Если он преуспевает, он возвращает целое число: – 1, если до порога – 2, если после порога
Надеюсь, это соответствует вашим потребностям.