如何在 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
谢谢!
如果您只是使用新数据库创建新应用程序,请删除具有 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 '],
],
也许这对某人有帮助。
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();
我在 AppController 中使用了这个:
Time::setToStringFormat('dd/MM/YYYY');
我表单中的日期字段是输入类型 "text" 以允许我的用户编写类似 31/12/2015.
的内容然而,当我尝试保存(MySQL 日期)时,我得到一些 Time Class 的错误,因为 table 中的值现在是 00-00-0000
谢谢!
如果您只是使用新数据库创建新应用程序,请删除具有 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 '],
],
也许这对某人有帮助。
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();