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

时间:2015-03-30 00:54:50

标签: php mysql cakephp cakephp-3.0

我在AppController中使用过它:

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

我的表单中的日期字段是输入类型" text"允许我的用户写一些类似 2015年12月31日的内容。

然而,当我尝试保存(MySQL日期)时,我收到了一些时间等级的错误,因为在表格中现在的值是00-00-0000

Alunos Controller code

谢谢!

5 个答案:

答案 0 :(得分:3)

我的最终解决方案是在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();

答案 1 :(得分:1)

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

根据以下评论进行修改

似乎问题是要将字符串字段从本地日期格式解析为php可以理解的内容。对于此任务,您只需配置DateTimeType类以使用区域设置感知格式解析日期,如此处所述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')

答案 2 :(得分:1)

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

插入 ['规则' => ['日期'' 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
    {
        ...
    }

答案 3 :(得分:1)

使用Postgres为我工作。

文件config / app.php

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

'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

答案 4 :(得分:1)

也许这可以帮助别人。

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