【问题标题】:Use localized date format with date picker in cakephp 3在 cakephp 3 中使用带有日期选择器的本地化日期格式
【发布时间】:2016-09-02 15:40:31
【问题描述】:

我正在构建一个 cakephp 3 应用程序(即 cakephp v3.3.2),但在选择的语言环境 (de_DE) 中显示日期时遇到问题。

我的示例中的数据库字段是invoice_date,它的类型是 DATE(存储在 mysql 数据库中)。

我想在网页中使用日期选择器(“zebra_datepicker”),因此在视图中我使用单个文本输入字段作为日期,而不是默认显示的三个下拉列表:

echo $this->Form->input('invoice_date', [ 'type' => 'text' ]);

为了以德语格式dd.mm.YY 显示日期,我将全局区域设置更改为

ini_set('intl.default_locale', 'de_DE');

config/bootstrap.php

为了测试,我在数据库中创建了一条新记录,并将 invoice_date 设置为 2016-09-02 (Y-M-D)。

如果我现在调用控制器的edit 操作,我会在表单中得到默认值02.09.16,这是正确的。但是如果我将表单提交回来,该字段的数据库值将变为2002-09-16

我需要在控制器中添加一些额外的代码来将日期格式改回原来的格式吗?这是 cakephp 本地化代码中的错误还是我错过了什么?请注意,我的控制器只使用patchEntity 来处理发布的数据。

我已经尝试在表对象的validationDefault方法中添加date('invoice_date', 'dmy'),但这并没有改变任何东西:

    $validator
        ->date('invoice_date', 'dmy')
        ->requirePresence('invoice_date', 'create')
        ->notEmpty('invoice_date');

感谢您的帮助!

【问题讨论】:

  • @Salines,感谢您的快速回复!我使用的数据库字段类型为DATE,因此指定 d.m.Y 应该没问题。为什么在我的情况下,语言环境设置不用于日期解析?!
  • 从请求中接受本地化数据时,最好接受用户本地化格式的日期时间信息。在控制器或调度程序过滤器中,您可以配置日期、时间和日期时间类型以解析本地化格式:尝试Type::build('date')->setLocaleFormat('dd.MM.yyyy');.book.cakephp.org/3.0/en/core-libraries/…
  • @WileE.Genius 询问此类问题时,您必须显示您的日期/时间类型配置(来自您的引导程序),并提及您的确切 CakePHP 版本。自 3.0.0 版本以来,发生了很多与时间相关的更改。
  • 感谢您的反馈!我只是重写了我的问题以澄清事实。希望问题现在更清楚...... :)

标签: date cakephp datepicker locale cakephp-3.0


【解决方案1】:

我刚刚找到了解决问题的方法:在 bootstrap.php 中,我必须添加:

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

这样,我可以输入像 31.12.16 (d.m.y) 这样的日期,并且日期会正确保存在数据库中。这适用于简单的验证器:

$validator
        ->date('invoice_date')
        ->notEmpty('invoice_date');

为了还支持31.12.2016 (d.m.Y) 之类的日期,我必须在日期验证器中添加一个额外的参数,如下所示:

$validator
        ->date('invoice_date', 'dmy')
        ->notEmpty('invoice_date');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2014-05-08
    • 2013-08-02
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2014-04-22
    相关资源
    最近更新 更多