用户可以从3个下拉菜单(日,月,年)中选择日期.我将在服务器端将它们组合起来,制作像'2008-12-30'这样的字符串.我如何验证以确保此日期格式正确/仅限数字等?
rav*_*ren 18
我个人认为这是确定日期是否符合格式和有效的正确和优雅方式:
20111-03-21视为无效 - 不像checkdate()explode()解决方案不同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<year>\d{2}|\d{4})([- /.])(?P<month>\d{1,2})\2(?P<day>\d{1,2})$#', $date, $matches )
&& checkdate($matches['month'],$matches['day'],$matches['year']);
}
Run Code Online (Sandbox Code Playgroud)
如果它们是3个单独的下拉菜单,则需要将它们验证为三个单独的值.
也就是说,
或者,您可以将它们全部转换为整数,将它们组合成一个日期,并查看生成的日期是否有效.也就是说,
$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
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是它只适用于Unix时间戳范围内的日期,即1970年至2038年左右.
我正在使用这个功能:
<?php
function validateMysqlDate( $date ){
if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $date, $matches)) {
if (checkdate($matches[2], $matches[3], $matches[1])) {
return true;
}
}
return false;
}
// check it:
$a = validateMysqlDate('2012-12-09 09:04:00');
$b = validateMysqlDate('20122-12-09 09:04:00');
$c = validateMysqlDate('2012-12_09 09:04:00');
$d = validateMysqlDate('');
var_dump( $a );
var_dump( $b );
var_dump( $c );
var_dump( $d );
?>
Run Code Online (Sandbox Code Playgroud)
$a 是真的,其他都是假的 - 这是正确的
Raveren 的函数(上图)不会覆盖带时间戳的有效日期!!!$a 在那里返回 false!顺便说一句: checkdate() 将为 $b 返回 true 虽然它不是有效的 mysql 日期时间
| 归档时间: |
|
| 查看次数: |
12005 次 |
| 最近记录: |