我需要一个正则表达式来验证日期和时间,格式如下:yyyy-mm-ddThh:mm:ss
。 T只是日期和时间之间的符号。谢谢你的帮助
答案 0 :(得分:3)
全功率解决方案:
function validate($str)
{
preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})$/', $str, $matches);
if (count($matches) != 7)
return false;
$valid_year = range(2000, 2050); // your range
$valid_month = range(1, 12);
$valid_day = range(1, 31);
$valid_hour = range(0, 24);
$valid_minute = range(0, 59);
$valid_second = range(0, 59);
list($str, $year, $month, $day, $hour, $minute, $second) = $matches;
foreach(array('year', 'month', 'day', 'hour', 'minute', 'second') as $part)
{
if (!in_array($$part, ${'valid_'.$part}))
return false;
}
return checkdate($month, $day, $year); // this will reject absurd values like February 30 or April 31
}
编辑:我不相信strtotime
。例如:“时间戳的有效范围通常是从星期五,1901年12月13日20:45:54 UTC到星期二,2038年1月19日03:14:07 UTC。” (引自strtotime
手册页)。如果我想接受超出此范围的日期怎么办?对我来说,strtotime
是一个未知的黑盒子。不要误会我的意思:我最终会使用它!但我不会这样做。
答案 1 :(得分:1)
试试这个正则表达式,在日期正则表达式和时间正则表达式之间加上字母'T':
(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})
答案 2 :(得分:1)
^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$
这将确保它的格式正确。然后,您需要调用像strtotime这样的函数来确保它也是一个有效的日期时间。
答案 3 :(得分:1)
我认为实际上并不需要,因为人/应用程序可能会根据系统的区域设置以不同的格式输入日期字符串。
最好的方法是从给定日期获取UNIX_TIMESTAMP并检查它是否是有效日期。
示例:
$date1 = "2011-02-23T13:04:41";
$date2 = str_replace("T", " ", $date1); // removing the T
$date3 = strtotime($date2);
现在您只需检查并使用$ date3 ..如果它有效或符合您的要求,那么原始输入日期也是如此。
万一你不需要所有这些混乱,请明白:
(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}) // pseudo - not tested
答案 4 :(得分:1)
检查时间值是否代表有效日期:
$t = strtotime($yourTimeString);
if ($t === FALSE) {
// $yourTimeString is not valid.
}
如果要验证字符串格式本身,请使用正则表达式检查。