php - Laravel 日期验证不适用于 20001 年
问题描述
我正在使用 Laravel 5.8 并尝试验证一个date
字段。该字段的名称是date_of_birth
,验证如下,
$validatedData = $request->validate([
'date_of_birth' => 'date|before:today',
]);
我只使用了date
规则,但是当它无法验证时,我正在尝试使用date|before:today
.
这两个日期规则都没有超过9999
. 验证我作为成功通过,并将MySQL
错误显示为无效日期。
我在日期验证上犯了什么错误还是一个错误?
解决方案
如果您尝试使用 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") 返回一个整数。验证规则无法解析日期。
推荐阅读
- python - 使用 python 3.7.3 发送带附件的电子邮件
- visual-c++ - 试图用 std::unique_ptr 调用替换删除指针调用
- paypal - 当国家/地区未知时,PayPal稍后付款消息?
- sql - 如何将值插入到具有复合主键的表中?
- android - 如何在 Jetpack Compose List / Column / Row 中禁用同时点击多个项目(开箱即用的去抖动?)
- r - 仅转置某些列 - 数据格式化
- r - R 配方中的一种热编码仅因子变量
- javascript - Rollupjs 捆绑外部依赖
- python - 关于:FutureWarning 的问题:在熊猫的未来版本中,DataFrame.drop 的所有参数,除了参数“标签”之外,将仅是关键字
- reactjs - 无法读取未定义的属性“向下”