以下是我之前验证日期的方式。 我也有自己的函数来转换日期格式,但是,现在正在使用PHP的DateTime类,因此不再需要它们。 我应该如何使用数据时间最好地验证有效日期?也请让我知道你是否认为我应该首先使用DataTime。 谢谢
附言。 我使用的是面向对象的样式,而不是过程样式。
static public function verifyDate($date)
{
//Given m/d/Y and returns date if valid, else NULL.
$d=explode('/',$date);
return ((isset($d[0])&&isset($d[1])&&isset($d[2]))?(checkdate($d[0],$d[1],$d[2])?$date:NULL):NULL);
}
你可以试试这个:
static public function verifyDate($date)
{
return (DateTime::createFromFormat('m/d/Y', $date) !== false);
}
这将输出真/假。您可以直接返回DateTime
对象:
static public function verifyDate($date)
{
return DateTime::createFromFormat('m/d/Y', $date);
}
然后你得到一个DateTime
对象,或者在失败时返回 false。
更新:
感谢 Elvis Ciotti 证明 createFromFormat 接受无效日期,如 45/45/2014。更多信息: https://stackoverflow.com/a/10120725/1948627
我使用严格的检查选项扩展了该方法:
static public function verifyDate($date, $strict = true)
{
$dateTime = DateTime::createFromFormat('m/d/Y', $date);
if ($strict) {
$errors = DateTime::getLastErrors();
if (!empty($errors['warning_count'])) {
return false;
}
}
return $dateTime !== false;
}
使用 DateTime,您可以为所有格式制作最短的日期和时间验证器。
function validateDate($date, $format = 'Y-m-d H:i:s')
{
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
var_dump(validateDate('2012-02-28 12:12:12')); # true
var_dump(validateDate('2012-02-30 12:12:12')); # false
函数是从这个答案或 php.net 复制的
你可以检查这个资源:http://php.net/manual/en/datetime.getlasterrors.php
PHP代码指出:
try {
$date = new DateTime('asdfasdf');
} catch (Exception $e) {
print_r(DateTime::getLastErrors());
// or
echo $e->getMessage();
}
试试这个:
function is_valid_date($date,$format='dmY')
{
$f = DateTime::createFromFormat($format, $date);
$valid = DateTime::getLastErrors();
return ($valid['warning_count']==0 and $valid['error_count']==0);
}
$date[] = '20/11/2569';
$date[] = 'lksdjflskdj';
$date[] = '11/21/1973 10:20:30';
$date[] = '21/11/1973 10:20:30';
$date[] = " ' or uid like '%admin%";
foreach($date as $dt)echo date('Y-m-d H:i:s', strtotime($dt))."n";
输出
1970-01-01 05:30:00
1970-01-01 05:30:00
1970-01-01 05:30:00
1973-11-21 10:20:30
1970-01-01 05:30:00
1970-01-01 05:30:00
我需要允许用户输入(n)不同的已知格式...包括微时间。下面是一个包含 3 的示例。
function validateDate($date)
{
$formats = ['Y-m-d','Y-m-d H:i:s','Y-m-d H:i:s.u'];
foreach($formats as $format) {
$d = DateTime::createFromFormat($format, $date);
if ($d && $d->format($format) == $date) return true;
}
return false;
}
对于以下内容,像 '' 或 0 或 '0000-00-00 00:00:00' 这样的空字符串是假的
$valid = strtotime($date) > 0;
,date_parse和检查日期的组合效果最好,它几乎是一行:
$date="2024-02-29";
$dp=date_parse("$date");
if (sprintf("%04d-%02d-%02d",$dp['year'], $dp['month'], $dp['day'])===$date && checkdate($dp['month'], $dp['day'], $dp['year'])) {
// format is OK and date is valid
}