如何在 CakePHP 3 中保存之前格式化日期字段?

How to format date fields before save in CakePHP 3?

我在 AppController 中使用了这个:

Time::setToStringFormat('dd/MM/YYYY');

我表单中的日期字段是输入类型 "text" 以允许我的用户编写类似 31/12/2015.

的内容

然而,当我尝试保存(MySQL 日期)时,我得到一些 Time Class 的错误,因为 table 中的值现在是 00-00-0000

Alunos Controller code

谢谢!

如果您只是使用新数据库创建新应用程序,请删除具有 0000-00-00 的日期并更改列定义以使其可以接受空值。使用 0000-00-00 作为日期通常是一件非常糟糕的事情,因为它只会产生错误和错误:)

根据以下评论进行编辑

问题似乎是将字符串字段从本地日期格式解析为 php 可以理解的格式。对于此任务,您只需配置 DateTimeType class 以使用此处所述的区域设置感知格式解析日期 http://book.cakephp.org/3.0/en/orm/database-basics.html#parsing-localized-datetime-data

// In bootstrap.php or AppController or your controller action:

use Cake\Database\Type;
...

Type::build('datetime')->useLocaleParser();

您还可以设置语言环境解析器来解析特定格式。要使上面的代码正常工作,请确保将您的应用程序设置为使用语言环境:

I18n::locale('fr-FR')

简单的解决方案在 CakePHP 中插入日期格式 3.x 在模型和自定义输出视图中:

插入['rule' => ['date','dmy']]

例子

public function validationDefault(Validator $validator)
{
    ...

    $validator
        ->add('demo_example_date', 'valid', ['rule' => ['date','dmy']]) //Format valid '30-12-2015' or '30-12-05'
        ->requirePresence('demo_example_date', 'create')
        ->notEmpty('factura_fecha');

    ...

    return $validator;
}

退出视图,设置AppController

    ...    

    use Cake\I18n\Time;
    use Cake\Database\Type;
    Time::$defaultLocale = 'es-ES';
    Time::setToStringFormat('dd-MM-YYYY');
    Type::build('datetime')->useLocaleParser();

    class AppController extends Controller
    {
        ...
    }

使用 Postgres 对我有用。

文件config/app.php

在变量 Datasources['default'] 中添加命令 'SET datestyle TO ISO, DMY' 到初始化

'Datasources' => [
        'default' => [            
            'init' => ['SET datestyle TO ISO, DMY '],
        ],

在mysql https://my.vertica.com/docs/7.1.x/HTML/Content/Authoring/SQLReferenceManual/Statements/SET/SETDATESTYLE.htm

也许这对某人有帮助。

public function beforeSave($event, $entity, $options) {
    $entity->dateField = date('Y-m-d', strtotime($entity->dateField));
}

我的最终解决方案是 bootstrap:

date_default_timezone_set('America/Sao_Paulo');
setlocale(LC_ALL, 'pt_BR', 'pt_BR.utf-8', 'pt_BR.utf-8', 'portuguese');

Type::build('time')->useImmutable();
Type::build('date')->useImmutable()->useLocaleParser();
Type::build('datetime')->useImmutable()->useLocaleParser();
Type::build('timestamp')->useImmutable();

\Cake\I18n\Time::setToStringFormat('dd/MM/yyyy HH:mm:ss');
\Cake\I18n\Date::setToStringFormat('dd/MM/yyyy');
\Cake\I18n\FrozenTime::setToStringFormat('dd/MM/yyyy HH:mm:ss');
\Cake\I18n\FrozenDate::setToStringFormat('dd/MM/yyyy');

\Cake\I18n\I18n::locale('pt-BR'); //new !

Type::build('decimal')->useLocaleParser();
Type::build('float')->useLocaleParser();