CakePHP 3时间列获取添加的日期

CakePHP 3时间列获取添加的日期,第1张

CakePHP 3时间列获取添加的日期

日期/时间值都被强制转换为相同的基本结构,即

DateTime
DateTimeImmutable
对象,因此,仅日期值会自然地加上时间值(
00:00:00
),而仅时间值会附带日期(当前日期)

CakePHP将根据SQL数据类型使用特定的子类,即

  • CakeI18nTime
    CakeI18nFrozenTime
    TIME
    TIMESTAMP
    DATETIME
  • CakeI18nDate
    CakeI18nFrozenDate
    DATE

在早期的CakePHP 3版本中,只有

CakeI18nTime

如果有一个单独的仅用于时间类型的类,这将是很好的,它会设置适当的仅时间的默认输出格式,但是在添加类似的东西之前,您必须自己照顾输出格式。

在您的视图中格式化

如何显示此视图取决于您。您可以轻松使用类实例的

i18nFormat()
方法
Time

$record['start_time']->i18nFormat(    [IntlDateFormatter::NONE, IntlDateFormatter::SHORT])

Time
助手,仅显示时间部分

$this->Time->i18nFormat(    $record['start_time'],    [IntlDateFormatter::NONE, IntlDateFormatter::SHORT])

猜想,如果bake根据列的类型生成类似的代码,那不会有什么坏处,您可能会
建议将其作为增强功能
。如前所述,对于仅时间列使用其他类(或选项)可能也值得考虑。

使用自定义时间类别

如果您希望在使用对象的字符串表示形式的任何地方都需要这种行为,而不必手动调用格式化程序,则可以使用带有重写属性的扩展

CakeI18nTime
CakeI18nFrozenTime
$_toStringFormat
,以便对日期进行相应的格式化。

src / I18n / FrozenTimeOnly.php

namespace AppI18n;use CakeI18nFrozenTime;class FrozenTimeonly extends FrozenTime{    protected static $_toStringFormat = [        IntlDateFormatter::NONE,        IntlDateFormatter::SHORT    ];}

src / config / bootstrap.php

use CakeDatabaseTypeTimeType;use AppI18nFrozenTimeOnly;TimeType::$dateTimeClass = FrozenTimeOnly::class;// remove the default `useImmutable()` call, you may however// want to keep further calls for formatting and stuffType::build('time'); // ...

现在,这几乎应该是自解释的,

time
正在映射到的列
TimeType
AppI18nFrozenTimeOnly
代替默认值使用
CakeI18nTime

DateTimeType::$dateTimeClass
不推荐使用

为了解决这个问题,将需要一个自定义的数据库类型,这也非常简单。

src /数据库/类型/TimeOnlyType.php

namespace AppDatabaseType;use AppI18nFrozenTimeOnly;use CakeDatabaseTypeTimeType;class TimeonlyType extends TimeType{    public function __construct($name)    {        parent::__construct($name);        $this->_setClassName(FrozenTimeOnly::class, DateTimeImmutable::class);    }}

应当注意,当前这将实例化数据/时间类两次,因为父构造函数也将调用

_setClassName()
该实例,在此实例化给定类的实例。

src / config / bootstrap.php

use AppDatabaseTypeTimeOnlyType;Type::map('time', TimeOnlyType::class);

因此,这将覆盖默认

time
类型映射以使用自定义
AppDatabaseTypeTimeOnlyType
类,而自定义类将
AppI18nTimeOnly
在将数据库值转换为PHP对象时使用该类,当将其转换为字符串时,将使用仅时间格式。

也可以看看
  • 食谱 >时间>设置默认语言环境和格式字符串
  • 食谱 >数据库访问和ORM>数据库基础>添加自定义类型


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5063014.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存