用户可以从3个下拉菜单(日,月,年)中选择日期。我将在服务器端将它们组合起来,制作像'2008-12-30'这样的字符串。然后我如何验证以确保此日期格式正确/仅限数字等?
答案 0 :(得分: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']);
}
答案 1 :(得分:6)
如果它们是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
这种方法的缺点是它只适用于Unix时间戳范围内的日期,即1970年至2038年左右。
答案 2 :(得分:4)
我正在使用此功能:
<?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 );
?>
$ a是真的,其他都是假的 - 这是正确的
Raveren(上图)的功能不包括带时间戳的有效日期! $ a在那里返回false! 并且btw:checkdate()将为$ b返回true,尽管它不是有效的mysql datetime
答案 3 :(得分:2)
您可以使用checkdate检查日期是否有效。如果您想确保值是数字和正确的长度,您可以做一些简单的事情,如 is_int ctype_digit和strlen组合之前你建立日期。
// untested
if( !ctype_digit)( $month ) || strlen( $month ) != 2 ) {
// handle error
}
// repeat for $day and $year
if ( checkdate( $month, $day, $year ) {
// do your work
}
答案 4 :(得分:1)
刚刚遇到同样的问题。我写了一个简短的函数来检查格式是否正确,以及日期是否真实:
function valid_mysql_date($str){
$date_parts = explode('-',$str);
if (count($date_parts) != 3) return false;
if ((strlen($date_parts[0]) != 4) || (!is_numeric($date_parts[0]))) return false;
if ((strlen($date_parts[1]) != 2) || (!is_numeric($date_parts[1]))) return false;
if ((strlen($date_parts[2]) != 2) || (!is_numeric($date_parts[2]))) return false;
if (!checkdate( $date_parts[1], $date_parts[2] , $date_parts[0] )) return false;
return true;
}
希望它有所帮助。
答案 5 :(得分:-1)
如果您有三个下拉列表,那么来自下拉列表的值应始终为数字,因为您控制与月份关联的值(如下所示)。然后,这将得出结合的结果是有效的。
<option value="01">January</option>
如果您在下拉列表中提供了提供帮助条目,例如“选择一个月”,那么您可以将该值设为0并确保来自每个下拉框的值大于零。
有人可能会更改HTML表单以提供其他值。如果这是一个问题,那么您可以使用PHP函数ctype_digit()来检查提供的每个值实际上是一个数字。
如果您担心日期实际有效,请使用checkdate()功能。