Intereting Posts
HTML / PHP-кодирование, специальные символы работают на одном сервере для не Разница строк php Удаление строки в файле PHP с помощью Start и End PHP oci_connect () TNS: не удалось разрешить идентификатор соединения (ORA-12154) MySQL выбирает конкретную запись из таблицы, которая не находится в другой таблице Проблема кодирования символов импорта CURL Настройка переменных среды со встроенным веб-сервером PHP Соответствие регулярных выражений, если максимум два вхождения точки и тире Отправка информации в ngnix из php на том же сервере без http INSERT INTO, если условие выполнено не удалось получить правильные данные с помощью метода почтовой отправки AngularJS Как определить возможности мобильного браузера PHP Как создать несколько сеансов? PHP: как обновить переменную родительского класса из дочернего класса Почему переменные $ _POST получают экранирование в PHP?

Проверьте, находится ли текущее время в два раза, с возможностью притирки дней

У меня есть система, которая принимает заявки пользователей, и после получения представления система будет проходить через все временные интервалы, чтобы найти соответствующий временной интервал. Проблема в том, что она должна иметь возможность проверять время начала и окончания, если конечное время заканчивается на следующий день.

Возьмем следующий пример: временной интервал начинается в 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, если после порога

Надеюсь, это соответствует вашим потребностям.