我想确保输入的生日不再存在。如果我输入未来日期,则应显示错误消息。
public function birth($name, $value) {
$datePattern = '/^[0-9]{2}\/[1-9]{2}\/[1-9]{4}?$/';
$match = preg_match($datePattern, $value);
if ( $match === false ) {
$field->setErrorMessage('Error testing field.');
return;
}
if ( $match != 1 ) {
$field->setErrorMessage('Invalid date format.');
return;
}
$dateParts = explode('/', $value);// i try to see if i could take everything after / to form an array
$month = $dateParts[0];
$day = $dateParts[1];
$year = $dateParts[2];
$dateString = $month . $day . $year;
$exp = new \DateTime($dateString);
$now = new \DateTime();
if ( $exp < $now ) {
$field->setErrorMessage('Cant be a date after the current date');
return;
}
$field->clearErrorMessage();
}
然而,它无法正常工作。我无法将$dateString
与DateTime
答案 0 :(得分:3)
您不需要正则表达式 - 只需将其与当前日期进行比较。
public function birth($name, $value) {
$timestamp = strtotime($value);
if ($timestamp === FALSE) {
// $value is not a valid date
}
if ($timestamp > time()) {
// date is in the future
}
}
但是,如果您想保留当前代码,则问题出在此行
$dateString = $month . $day . $year;
这不是有效的日期表示。今天是572014
- 您需要在其间添加/
并且它会起作用。
$dateString = sprintf("%u/%u/%u", $month, $day, $year);