preg_match для формата даты mysql

im пытается проверить дату, чтобы увидеть, соответствует ли она формату 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.

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

Осторожно:

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

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

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

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

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

хорошо, что я это сделал. поскольку im форсирует формат даты и конечные секунды временной части

Я просто подтвердил час: мини-часть, используя "/^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); } } 

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

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

 $e = '2011-03-01 00:00:00'; $mysqlFormat = date('Ymd 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 поэтому он никогда не 00,01,02,03,10,11,12,13,20,21,22,23 4 утра, или 3 вечера среди других. В остальном я просмотрел ваш регекс, и я не вижу никаких проблем с ним в соответствии с вашими тестовыми примерами. Я бы проверить, чтобы не было лишних пробелов с обеих сторон строки даты с trim ().

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