Laravel日期验证不适用于20001年

时间:2019-07-27 14:47:11

标签: php laravel datetime

我正在使用Laravel 5.8并尝试验证date字段。字段的名称为date_of_birth,验证如下所示

$validatedData = $request->validate([
    'date_of_birth'     => 'date|before:today',
]);

我仅使用date规则,但是当验证失败时,我尝试使用date|before:today

这两个日期规则在任何一年都没有比9999更好。我作为成功通过的验证和MySQL将错误显示为无效日期。

我在日期验证中是否犯了任何错误,还是一个错误?

1 个答案:

答案 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”)返回整数。验证规则无法解析日期。