我试图验证日期以查看它是否与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)
但是,如果我手动将日期字符串插入到preg_match中
preg_match($match, "2011-03-01 00:00:00")
它有效。
我不知道我做错了什么
======================
现在我考虑一下,我只需要验证日期时间字符串的最后部分。
我手动添加秒,日期由日期选择器强制,用户无法编辑它
答案 0 :(得分:1)
小心:
[0-2][0-3]
对于小时值不是一个好的正则表达式 - 它会与01
,12
,23
和其他人匹配,但它会通过04
失败09
和14
到19
。
更好地使用(2[0-3]|[01][0-9])
。
答案 1 :(得分:1)
你正在努力使你的工作变得更加困难。在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。
答案 2 :(得分:1)
好的,我做了。 因为我强迫日期格式和时间部分的结束秒
我刚用"/^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);
}
}
答案 3 :(得分:0)
答案 4 :(得分:0)
为什么不简单地将日期强制为您想要的格式:
$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()。
答案 5 :(得分:0)
我同意Tim的观点:MySQL的行为处于怪癖模式,并且总是试图在DATE和DATE_TIME列类型上轻松实现。您可以省略输入的某些部分,它仍会尝试在某种程度上成功补偿并实现该目标...这就是为什么,您的Reg-ex认为无效的大多数数字,MySQL将接受为有效。
答案 6 :(得分:0)
我用它来验证'Y-m-d H:i:s'格式日期字符串:
match = '/^[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/';