首页 > 解决方案 > Laravel 日期验证不适用于 20001 年

问题描述

我正在使用 Laravel 5.8 并尝试验证一个date字段。该字段的名称是date_of_birth,验证如下,

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

我只使用了date规则,但是当它无法验证时,我正在尝试使用date|before:today.

这两个日期规则都没有超过9999. 验证我作为成功通过,并将MySQL错误显示为无效日期。

我在日期验证上犯了什么错误还是一个错误?

标签: phplaraveldatetime

解决方案


如果您尝试使用 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 位在任一方向上都可以代表大约 2930 亿年。

您可能可以创建一个自定义验证规则,根据秒数验证日期(假设 64 位 PHP)

更新:查看文档进行验证并发现

之前:日期

验证中的字段必须是给定日期之前的值。日期将被传递到 PHP strtotime 函数中。此外,与 after 规则一样,可以提供另一个正在验证的字段的名称作为 date 的值。

有趣的是,strtotime("10000-01-01 00:00:00") 返回 false,而 strtotime("9999-12-31 23:59:59") 返回一个整数。验证规则无法解析日期。


推荐阅读