我从API接收日期字符串,格式为yyyy-mm-dd.
我目前正在使用正则表达式验证字符串格式,这可以正常工作,但我可以看到一些情况,根据字符串,它可能是一个正确的格式,但实际上是一个无效的日期.即2013-13-01,例如.
有没有更好的方法在PHP中获取字符串,2013-13-01并告诉它是否是格式的有效日期yyyy-mm-dd?
DateTime的RegEx模式是什么(2008-09-01 12:35:45)?
我收到此错误:
找不到结尾分隔符'^'
使用:
preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45');
Run Code Online (Sandbox Code Playgroud)
给出了这个错误:
警告:preg_match()[function.preg-match]:编译失败:在第19行的E:\ www\index.php中偏移0处不重复
嗨,我似乎无法让datetime方法按预期工作?我可能做错了什么?
// Passes OK
$dateTime = DateTime::createFromFormat('d/m/Y', '12/12/2012' );
var_dump($dateTime);
// should fail but returns - 2016-09-25
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012' );
var_dump($dateTime);
// correctly returns False
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/fail' );
var_dump($dateTime);
// should fail but returns 2019-08-29 09:58:10
$dateTime = DateTime::createFromFormat('m/d/Y', '90/90/2012' );
var_dump($dateTime);
Run Code Online (Sandbox Code Playgroud)

function validateDate( $date )
{
echo $date;
//2012-08-24 20:30:00
if(preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/', $date) >= 1)
{
return true;
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这总是返回false.我使用了一个唯一的工具来构建正则表达式,它在那里工作得很好.当我将"/"添加到正则表达式时,麻烦就开始了.不知何故PHP似乎需要这些,但我不知道为什么,我不知道为什么它打破了我的正则表达式.
它应该返回TRUE for sth.像"2012-08-24 20:30:00"和"asdf2012-08-24 20:30:00asdf"或任何不符合我的正则表达式的任何错误
提前致谢!
-----------------------编辑感谢您的所有答案!
正如一些用户指出我的函数在样本日期"2012-08-24 20:30:00"返回true.但是,只有当我手动设置$ date ='2012-08-24 20:30:00'时才会这样做.如果我使用完全相同的字符串在我的代码中的其他地方调用该函数,则返回false.有谁知道为什么?
----------------------- EDIT2
对不起浪费你的时间,实际上是一些空格被添加到字符串中.在调用我的函数之前在我的日期使用trim()会给出正确的结果.
感谢大家!