用户可以从3个下拉菜单(日,月,年)中选择日期.我将在服务器端将它们组合起来,制作像'2008-12-30'这样的字符串.我如何验证以确保此日期格式正确/仅限数字等?
我个人认为这是确定日期是否符合格式和有效的正确和优雅方式:
将日期20111-03-21
视为无效 - 不像checkdate()
没有可能的PHP警告(如果提供任何一个参数,自然) - 与大多数explode()
解决方案不同
与仅使用正则表达式的解决方案不同,需要考虑闰年
完全兼容mysql DATE
格式(10.03.21与2010-03-21相同)
这是您可以使用的方法:
/** * Tests if a string is a valid mysql date. * * @param string date to check * @return boolean */ function validateMysqlDate( $date ) { return preg_match( '#^(?P\d{2}|\d{4})([- /.])(?P \d{1,2})\2(?P \d{1,2})$#', $date, $matches ) && checkdate($matches['month'],$matches['day'],$matches['year']); }
如果它们是3个单独的下拉菜单,则需要将它们验证为三个单独的值.
也就是说,
验证年份列是否为数字,以及应用中的有效年份
验证月份列是否为数字
验证day列是否为数字
使用checkdate()验证它们都是有效值
或者,您可以将它们全部转换为整数,将它们组合成一个日期,并查看生成的日期是否有效.也就是说,
$time = mktime(0, 0, 0, (int)$_POST['month'], (int)$_POST['day'], (int)$_POST['year']); // in this example, valid values are between jan 1 2000 (server time) and now // modify as required if ($time < mktime(0, 0, 0, 1, 1, 2000) || $time > time()) return 'Invalid!'; $mysqltime = date('Y-m-d', $time); // now insert $mysqltime into database
这种方法的缺点是它只适用于Unix时间戳范围内的日期,即1970年至2038年左右.