【问题标题】:Laravel date validation not working for year 20001Laravel 日期验证不适用于 20001 年
【发布时间】:2019-12-05 13:49:39
【问题描述】:

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

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

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

对于任何比9999 大的年份,这两个日期规则都失败了。我通过的验证成功,MySQL 将错误显示为无效日期。

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

【问题讨论】:

  • 你试过date_format:Y-m-d|before:today吗?
  • 没有,但是date 对您有用吗?我正在使用日期类型输入字段,该应用程序将用于不同国家。我不确定用户查看日期的格式。

标签: php laravel datetime


【解决方案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 位可以在任一方向上代表大约 2930 亿年。

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

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

之前:日期

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

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

【讨论】:

  • 谢谢。由于高于 10000 的年份行为异常,因此应通过日期验证来解决。但是验证也不起作用。如果我是唯一一个面临这个问题的人,我很困惑。
  • 我挖得更远,发现了一些可能对你有帮助的东西,请检查答案的更新
猜你喜欢
  • 2014-08-14
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多