preg_match для формата даты mysql - PullRequest
1 голос
/ 28 февраля 2011

я пытаюсь проверить дату, чтобы увидеть, соответствует ли она формату mysql

это код

$match = "/^\d{4}-\d{2}-\d{2} [0-2][0-3]:[0-5][0-9]:[0-5][0-9]$/";

    $s = $this->input->post("report_start"). " " . $this->input->post("report_start_time").":00";
    $e = $this->input->post("report_end"). " " . $this->input->post("report_end_time").":59";

    if($this->input->post("action") != "")
    {
        echo trim($s). " => " . preg_match($match, trim($s));
        echo "<br>";
        echo trim($e). " => " . preg_match($match, trim($e));
}

формат даты входит в $ s, а $ e равны

$s = 2011-03-01 00:00:00
$e = 2011-03-01 23:59:59

и оба возвращают false (0).

Я протестировал шаблон на http://www.spaweditor.com/scripts/regex/index.php и он возвращает true (1)

http://pastebin.com/pFZSKYpj

однако, если я вручную вставляю строки даты в preg_match, как

preg_match($match, "2011-03-01 00:00:00")

, это работает.

я понятия не имею, что я делаю неправильно

======================

Теперь, когда я об этом думаю, мне нужно только проверить часть houre: min строки datetime.

я вручную добавляю секунды, дата выбирается датчиком, и пользователи не могут его редактировать

Ответы [ 6 ]

1 голос
/ 28 февраля 2011

хорошо, вот и я. так как я заставляю формат даты и конечные секунды части времени

я только что проверил час: мини-часть, используя "/^2[0-3]|[01][0-9]:[0-5][0-9]$"; и если это возвращает true, я собираю все вместе и восстанавливаю окончательную строку даты и времени

    $match = "/^2[0-3]|[01][0-9]:[0-5][0-9]$/";

    $s_d = $this->input->post("report_start");
    $s_t = $this->input->post("report_start_time");
    $e_d = $this->input->post("report_end");
    $e_t = $this->input->post("report_end_time");

    if($this->input->post("action") != "")
    {


        if(
            ( preg_match($match , trim($s_d." ".$s_t.":00")) )
         && ( preg_match($match , trim($e_d." ".$e_t.":59")) )
         )
         {

            $r = $this->model_report->client_hours_logged(array($s,$e));
            $data['report'] = $r;
            var_dump($r);
            //$this->load->view("report/client_hours_per_client",$data);
         }
    }
1 голос
/ 28 февраля 2011

Вы делаете свою работу тяжелее, чем она должна быть. В php есть много функций обработки дат, которые означают, что вам не нужно обрабатывать даты как строки. Поэтому вместо того, чтобы проверять, что введенные вами даты имеют правильный формат, просто настаивайте на правильном формате:

$adate= date_create('January 6, 1983 1:30pm'); //date format that you don't want
$mysqldate= $adate->format("Y-m-d h:i:s");//date format that you do want

Существуют также функции для проверки того, что дата является реальной, например, checkdate .

1 голос
/ 28 февраля 2011

Берегитесь:

[0-2][0-3] не является хорошим регулярным выражением для значений часов - оно будет соответствовать 01, 12, 23 и другим, но оно не будет работать от 04 до 09 и 14 до 19.

Лучше использовать (2[0-3]|[01][0-9]) вместо.

0 голосов
/ 28 февраля 2011

Я согласен с Тимом: MySQL ведет себя в режиме причуд и всегда старается не беспокоиться о типах столбцов DATE и DATE_TIME. Вы можете пропустить некоторые части своего ввода, и он все равно будет пытаться компенсировать и в некоторой степени успешно достичь этой цели ... Вот почему большинство номеров, которые ваш Reg-ex считает недействительными, MySQL примет как действительные.

0 голосов
/ 28 февраля 2011

Почему бы просто не принудительно ввести дату в нужный вам формат:

$e = '2011-03-01 00:00:00';
$mysqlFormat = date('Y-m-d H:i:s', strtotime($e));

Кроме того, в вашем регулярном выражении есть небольшая ошибка: [0-2][0-3]:[0-5][0-9]:[0-5][0-9] будет соответствовать только часам 00,01,02,03,10,11,12,13,20,21,22,23, поэтомуэто никогда не будет соответствовать 4 утра или 3 вечера среди других.Кроме того, я просмотрел ваш RegEx и не вижу проблем с ним в соответствии с предложенными вами тестами.Я бы проверил, чтобы убедиться, что по обеим сторонам строки даты нет лишних пробелов с помощью trim ().

0 голосов
/ 28 февраля 2011

Вы можете использовать strtotime и date для правильного анализа и форматирования даты.

...