我正在尝试以d-m-Y格式验证输入类型为“ date”的日期。日期不能高于今天。 我正在转换数字差,然后询问数字是否小于0。
这是我的验证功能:
SCNView
该功能不起作用。用户可以选择将来的任何日期,并且该日期会以YYYY-MM-DD的形式直接进入数据库。
我很迷失在这里,任何帮助将不胜感激。
答案 0 :(得分:0)
对于初学者来说,这可能是一个不好的举动:
$dateToday = date_create(date('d-m-Y'));
这很糟糕,因为日期和月份都有两位数字。虽然实际上可以给您期望的结果,但是它与美国编码人员的直觉相反,因为日期通常在此处写为m-d-Y。我建议使用date("F j, Y")
这是一种更清晰的日期格式:
var_dump(date("F j, Y")); // outputs "December 8, 2018"
其次,您似乎没有对提供给函数的$ date参数进行任何验证。大概是d-m-Y格式的字符串,您应该通过一些验证来强制执行。
最后,您在此行中指定的%a
格式化程序仅提供了日期差的数字...它没有指定是正还是< em>负差异。
if(date_diff($dateToday, $datetime)->format('%a') < 0){
//blah blah blah
}
您还需要包括%R
格式标志,以获取差异的+/-:
if(date_diff($dateToday, $datetime)->format('%R%a') < 0){
//blah blah blah
}
最后,从PHP 5.2.2。开始,您可以只比较使用比较运算符创建的日期对象。这比将字符串与零进行比较的代码更好。试试这个功能:
public static function validateDate($date){
if (!preg_match('/^\d{2}-\d{2}-\d{4}$/', $date)) {
throw new Exception("$date is not a valid date in d-m-Y format");
}
$today = date_create(date("Y-m-d"));
$datetime = date_create($date);
if ($datetime > $today) {
return false;
} else {
return true;
}
}