【问题标题】:Cakephp 3.2 change default date formatCakephp 3.2 更改默认日期格式
【发布时间】:2016-02-27 22:25:45
【问题描述】:

我尝试将CakePHP 3.2 的默认日期格式从dd.mm.YYYY 设置为YYYY-mm-dd,这样我就不必使用$MyDatas->mydate->format('Y-m-d'),在编辑数据时表单中更重要的是我将有日期格式dd.mm.YYYY(前 27.02.2016)。我需要YYYY-mm-dd (2016-02-27)。

我寻找了解决方案,但没有显示任何更改(在表单中或作为视图的一部分:$MyDatas->mydate):

// in AppController

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

//and/or

use Cake\Database\Type;
Type::build('datetime')->useLocaleParser()->setLocaleFormat('YYYY-mm-dd');

//and/or

use Cake\I18n\I18n;
I18n::locale('pl_PL');

//and/or

use Cake\I18n\Time; 
Time::$defaultLocale = 'pl-PL'; //and or
Time::setToStringFormat('YYYY-mm-dd HH:mm');//and or
Type::build('datetime')->useLocaleParser(false);//and or

上面的代码都没有帮助。有谁知道如何更改日期格式?

【问题讨论】:

  • 具体列是DATE,还是DATETIME
  • 在 MySQL 中我有:date_start (DATE), date_end(DATE)。对于 DB 中 date_start='2016-02-27' cake 将显示 27.02.2016 的行

标签: date cakephp format date-formatting cakephp-3.2


【解决方案1】:

我猜你已经升级到 CakePHP 3.2,否则你会在 config/bootstrap.php 文件中看到 DATEDATETIMETIME 类型列的不同类型。

在 CakePHP 3.2 中,date 类型不再映射到 Cake\I18n\Time,而是映射到 \Cake\I18n\Date(或在指示使用不可变对象时 \Cake\I18n\FrozenDate),它需要单独配置,这就是为什么更改 datetime 类型或 \Cake\I18n\Time 类配置不会影响您的 DATE 列。

要为后者配置格式,请使用\Cake\I18n\Date 和/或\Cake\I18n\FrozenDate 类和date 类型。在您的引导程序中,您可以执行类似的操作

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

// ...

Cake\I18n\Date::setToStringFormat('yyyy-MM-dd');
Cake\I18n\FrozenDate::setToStringFormat('yyyy-MM-dd');

\Cake\Database\Type::build('date')
    ->useImmutable()
    ->useLocaleParser()
    ->setLocaleFormat('yyyy-MM-dd');

这将覆盖使用pl_PL 语言环境时应用的默认值。请注意,您应该使用yyyy 而不是YYYY(因为后者定义了week-numbering year),并且应该使用MM 而不是mm(因为后者定义了分钟)。 p>

请参阅 https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax 了解 CakePHP 内部使用的 intl 格式化程序使用的格式。

另请注意,还有 \Cake\I18n\Date::$wordFormat\Cake\I18n\Date:$niceFormat 您可能也想更改。

另见

【讨论】:

  • 我从我的代码中清除了我的 AppController.php。我将您的解决方案添加到 bootstrap.php 中,但它不起作用。但是我通过删除 ->useImmutable() 更改了您的 Type::build('date') 规则: Type::build('date')->useLocaleParser()->setLocaleFormat('YYYY-MM-dd');它奏效了! THX
  • @MasterAbe useImmutable() 不应以任何方式影响解析/格式化。
  • 但它确实...删除它像我需要的那样格式化日期,但只是添加它不会改变日期格式。我在引导程序和 AppController 中对其进行了测试。
  • @MasterAbe 抱歉,忘记了 \Cake\I18n\FrozenDateCake\I18n\Date 不共享相同的配置。我已经更新了我的答案。
  • 我做了所有这些配置,但它不起作用。当我在控制器中回显时,数据是正确的:2016 年 12 月 15 日。但是当它进入验证规则时,它说这是一个无效的日期。我做了你们说的配置,但只是将格式更改为 dd/MM/yyyy。仍然无法正常工作:(任何解决方案?在进行规则验证之前,我是否必须解析字符串以将其转换为日期类型?
【解决方案2】:

经过大量搜索,我找到了。

在 config/app.php 下的 'App' => []

改变

'defaultLocale' => env('APP_DEFAULT_LOCALE', 'us_US'),

'defaultLocale' => env('APP_DEFAULT_LOCALE', 'pl_PL'),

您的所有日期都将更改为您的格式。 因为在 配置/boostrap.php 它读了

ini_set('intl.default_locale', Configure::read('App.defaultLocale'));

end in the cake\I18n FrozenDate 它设置为

protected static $_toStringFormat = [IntlDateFormatter::SHORT, -1];

【讨论】:

    【解决方案3】:

    将此代码粘贴到此文件中config/site.php

    return [
     'Site' => [      
            'CakeDateFormat' => 'Y-M-d',
            'DatePickerFormat' => 'mm/dd/yyyy',
            'CakeDateFormatForView' => 'm/d/Y',        
        ]
    ]
    

    在控制器中使用此日期格式:

    use Cake\I18n\Time;
    
    $this->request->data['date'] =Time::parseDate($this->request->data['date'], Configure::read('Site.CakeDateFormat'));
    

    CakeDateFormat中根据需要设置日期格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2016-02-17
      • 2017-08-28
      • 1970-01-01
      • 2011-03-09
      相关资源
      最近更新 更多