我正在使用Laravel 5.8并尝试验证date
字段。字段的名称为date_of_birth
,验证如下所示
$validatedData = $request->validate([
'date_of_birth' => 'date|before:today',
]);
我仅使用date
规则,但是当验证失败时,我尝试使用date|before:today
。
这两个日期规则在任何一年都没有比9999
更好。我作为成功通过的验证和MySQL
将错误显示为无效日期。
我在日期验证中是否犯了任何错误,还是一个错误?
答案 0 :(得分:1)
如果您尝试使用DateTime本地转换大于10000的日期,则会发生以下情况
$date = new DateTime("9999-12-31");
var_dump($date->format('Y-m-d'));
$date_2 = new DateTime("10000-01-01");
var_dump($date_2->format('Y-m-d'));
结果:
string(10) "9999-12-31"
string(10) "2000-01-01"
请注意,高于10,000年的值会出现意外结果。
但是,如果您使用的是64位版本的PHP,则可以在任一方向上查找约2930亿年的日期,请参见https://php.net/strtotime
时间戳的有效范围通常为1901年12月13日星期五20:45:54 UTC到2038年1月19日星期二03:14:07 UTC。 (这些是与32位带符号整数的最小值和最大值相对应的日期。)
在PHP 5.1.0之前,并非所有平台都支持负时间戳,因此您的日期范围不得超过Unix时代。这意味着例如1970年1月1日之前的日期将不适用于Windows,某些Linux发行版和其他一些操作系统。
对于64位版本的PHP,时间戳的有效范围实际上是无限的,因为64位可以在任一方向上代表大约2,930亿年。
您可能会创建一个自定义验证规则,该规则将根据秒数(假设使用64位PHP)来验证日期
更新:查看文档进行验证并找到
之前:日期
正在验证的字段必须是给定日期之前的值。日期将被传递到PHP strtotime函数中。另外,像after规则一样,可以将验证中的另一个字段的名称作为date的值提供。
有趣的是,strtotime(“ 10000-01-01 00:00:00”)返回false,而strtotime(“ 9999-12-31 23:59:59”)返回整数。验证规则无法解析日期。