Сравнение времени, чч: мм и ч: мм в PHP - PullRequest
0 голосов
/ 08 октября 2019

У меня проблема со сравнением hh:mm и h:mm, пример кода ниже. Обратите внимание, что это пример, на самом деле, я получаю данные из базы данных.

Этот код проверяет формат времени hh:mm и h:mm, используя pregex, а также проверяет, если $EndTimeранее $StartTime будет echo 'Time Error', в основном EndTime не может быть раньше StartTime (EndTime должен быть позже StartTime). Поэтому, если любая из проверок верна, она будет echo 'Time Error'.

$StartTime = '8:00';
$EndTime = '19:00';
if(!preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $StartTime) || ($StartTime > $EndTime)){
    echo 'Time Error';
}
else{
    echo 'Time Correct';
}

. Приведенный выше код будет echo 'Time Error', если я использую 8:00 в качестве моего StartTime. Однако, если я использую 08:00 в качестве моего StartTime, это будет echo 'Time Correct'.

, если я изменю его на:

$StartTime = '19:00';
$EndTime = '8:00';

Это будет echo 'Time Correct', что не должно иметь место, поскольку EndTime раньше, чем StartTime. То же самое, если я изменю его на 08:00, оно покажет мне правильное сообщение.

Проверено pregex для 8:00 и 08:00, и оба имеют правильный формат времени.

Почемуэто так и как я могу исправить эту ошибку? Что-то не так со сравнением времени?

Заранее благодарим за любую оказанную помощь.

Спасибо, Лукас Арбекс, за предложение strtotime. Кажется, сейчас работает.

$startTime = ('00:00');
$endTime = ('08:00');

if((!preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $startTime)) || (strtotime($startTime) > strtotime($endTime)) || (!preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $EndTime))){
  echo 'Time Error';
}
else{
  echo 'Time Correct';
}

Ответы [ 3 ]

0 голосов
/ 08 октября 2019

Проверка формата выполняется отдельно от сравнения времени. Добавьте ведущий ноль, если у времени его еще нет.

if(!preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $StartTime) || !preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $EndTime)){
    echo 'Time Error';
} else {
    if ($StartTime[1] == ":") {
        $StartTime = "0" . $StartTime;
    }
    if ($EndTime[1] == ":") {
        $EndTime = "0" . $EndTime;
    }
    if ($StartTime > $EndTime) {
        echo 'Time Error';
    } else {
        echo 'Time Correct';
    }
}
0 голосов
/ 09 октября 2019

Вы можете проверить входящие выражения времени и проверить наличие дополнительного начального нуля в шаблоне регулярных выражений. Нет необходимости совершать дополнительные strtotime() звонки.

Код: ( PHP Demo ) ( Regex Demo )

$startTime = '19:00';
$endTime = '8:00';

if (!preg_match("~^(?|(2)\K[0-3]|([01]?)\K\d):[0-5]\d$~", $startTime, $start) || 
    !preg_match("~^(?|(2)\K[0-3]|([01]?)\K\d):[0-5]\d$~", $endTime, $end) ||
    (int)$start[1] . $start[0] > (int)$end[1] . $end[0]
) {
        // var_export($start);
    echo "\nTime Error\n";
        // var_export(((int)$start[1] . $start[0]) . ' versus ' . ((int)$end[1] . $end[0]));
}
// outputs: Time Error

Приведенная выше методика использует шаблон, который захватывает цифру часа (необязательно, если сразу следует другая цифра), а затем перезапускает совпадение полной строки с \K. «Сброс ветви» (|...|...) используется, чтобы убедиться, что обе группы захвата рассматриваются как элемент [1] в массиве совпадений. Делая начальную цифру необязательной, вы можете опустить третью ветку в исходном шаблоне. Кроме того, я предпочитаю более короткое значение \d, чем [0-9].


Если это слишком запутанно для вас, вы можете также разрешить php сравнивать две строки как значения с плавающей запятой.

Код: ( PHP Demo )

if (!preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $startTime) || 
    !preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $endTime) ||
    str_replace(':', '.', $startTime) > str_replace(':', '.', $endTime)
) {
    echo "\nTime Error\n";
        // var_export(str_replace(':', '.', $startTime) . ' versus ' . str_replace(':', '.', $endTime));
}

И, конечно, вы можете безоговорочно применять отступы слева с нулями. (Как вы можете видеть, есть много способов снять кожу с этой кошки.)

if (!preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $startTime) || 
    !preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $endTime) ||
    str_pad($startTime, 5, 0, STR_PAD_LEFT) > str_pad($endTime, 5, 0, STR_PAD_LEFT)
) {
    echo "\nTime Error\n";
        // var_export(str_replace(':', '.', $startTime) . ' versus ' . str_replace(':', '.', $endTime));
}
0 голосов
/ 08 октября 2019

Вы можете просто использовать strtotime() для анализа строки в datetime после проверки, например:

$starttime = '19:00';
$endtime = '8:00';

$validatedStarttime = preg_match("/([01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?/", $starttime);
$validatedEndtime = preg_match("/([01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?/", $endtime);

if($validatedStarttime && $validatedEndtime) {
    if(strtotime($starttime) > strtotime($endtime)) {
        echo 'Time Error';
    } else {
        echo 'Time Correct';
    }
} else {
    echo 'Incorrect Format';
}

Дайте мне знать, помогло ли это вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...