php - 无法在 CakePHP 应用程序中存储 01/01/1600 之前的日期

标签 php mysql date cakephp cakephp-3.0

我有一个非常简单的表格。

Evenementshistoriques table

我用

生成了文件
bin\cake bake all [tableName]

我现在有一个可以添加/编辑/删除条目的表单。

Form

问题是,如果我输入 1600 年 1 月 1 日之前的日期,我会收到一条错误消息,指出该日期无效。

Error

我假设错误来自验证器。

验证规则如下:

 /**
 * Default validation rules.
 *
 * @param \Cake\Validation\Validator $validator Validator instance.
 * @return \Cake\Validation\Validator
 */
public function validationDefault(Validator $validator)
{
    $validator
        ->integer('id')
        ->allowEmpty('id', 'create');

    $validator
        ->date('debut_date')
        ->allowEmpty('debut_date');

    $validator
        ->date('fin_date')
        ->allowEmpty('fin_date');

    $validator
        ->allowEmpty('nom');

    $validator
        ->allowEmpty('description');

    return $validator;
}

我不明白为什么会出现这个错误。你能帮帮我吗?

谢谢

最佳答案

验证不支持

看起来验证根​​本不允许 1600 之前的年份。

1[6-9]|[2-9]

https://github.com/cakephp/cakephp/blob/3.2.10/src/Validation/Validation.php#L404

我不确定这背后的原因,也许是为了应对某些 DBMS 的存储限制,例如 SQL Servers 1/1/1753 minimum:

What is the significance of 1/1/1753 in SQL Server?

考虑替代存储类型,甚至不同的 DBMS

鉴于您要存储 1000 之前的年份,值得一提的是,MySQL 的 DATE 类型是 supported range1000-01-01 开始(正如@user221931 在评论中提到的)。虽然在 1000 之前的几年似乎有非官方支持(即 0861-07-03 实际上可以存储和使用),但这可能不是您想要的依靠。

可能的解决方案在这里有点离题,并且已经在 SO 上讨论过了,比如

Does MySQL support historical date (like 1200)?

您可以使用自定义正则表达式

无论这是否应该在核心中进行更改,无论如何您都可以提供自己的正则表达式以供日期验证使用,以便接受您需要的几乎任何日期,但是您需要使用 add() 作为 date() 不支持自定义正则表达式(可能值得改进),例如

->add('fin_date', [
    'rule' => ['date', null, '\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])']
])

该检查可能过于宽松,但您应该明白这一点。

您可能要开工单over at GitHub或访问 IRCSlack并要求核心团队澄清。我个人认为开箱即用地支持未过时/受限的 DBMS(假设这实际上是该行为的原因)是值得改进的。

关于php - 无法在 CakePHP 应用程序中存储 01/01/1600 之前的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37896735/

相关文章:

php - 表单验证与依赖外键约束

php - 在 laravel 5.3 中调用 SEOStats 实例时找不到类 'SEOstats\SEOstats'

php - 将记录从一个表插入到另一个表

php - 打印 mysqli 查询结果

java - Hamcrest 日期匹配器

php - PDO 自准备返回空字符串

mysql - GEO 位置反转 PHP 和 SQL

mysql - 导入错误 : No module named MySQLdb in Zope

java - 使用 SimpleDateFormat 将字符串转换为日期

最近 6 个月的 SQL Server 查询