日付/時刻の値はすべて同じ基本構造、つまりDateTimeにキャストされています またはDateTimeImmutable オブジェクトであるため、当然、日付のみの値には時間値が追加されます(00:00:00 )、および時間のみの値には日付(現在の日付)が付いています。
CakePHPは、SQLデータ型に応じて特定のサブクラスを使用します。つまり
-
\Cake\I18n\Timeまたは\Cake\I18n\FrozenTimeTIMEの場合 、TIMESTAMP、およびDATETIME -
\Cake\I18n\Dateまたは\Cake\I18n\FrozenDateDATEの場合
以前のCakePHP3バージョンでは、\Cake\I18n\Timeしかありませんでした 。
時間のみのタイプ用に別のクラスがあり、適切な時間のみのデフォルトの出力形式が設定されていると便利ですが、そのようなものが追加されるまでは、出力形式を自分で管理する必要があります。 。
ビューのフォーマット
これをビューに表示する方法はあなた次第です。 i18nFormat()を簡単に使用できます Timeのメソッド クラスインスタンス
$record['start_time']->i18nFormat(
[\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)
またはTime ヘルパー、時間の部分のみを表示する
$this->Time->i18nFormat(
$record['start_time'],
[\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT]
)
bakeが列のタイプに応じて同様のコードを生成する場合でも問題はないと思います。
カスタム時間クラスを使用する
フォーマッタを手動で呼び出さなくても、オブジェクトの文字列表現が使用されているすべての場所でこの動作が必要な場合は、拡張された\Cake\I18n\Timeを利用できます。 または\Cake\I18n\FrozenTime オーバーライドされた$_toStringFormatを持つクラス プロパティ。それに応じて日付をフォーマットします。
src / I18n / FrozenTimeOnly.php
namespace App\I18n;
use Cake\I18n\FrozenTime;
class FrozenTimeOnly extends FrozenTime
{
protected static $_toStringFormat = [
\IntlDateFormatter::NONE,
\IntlDateFormatter::SHORT
];
}
src / config / bootstrap.php
use Cake\Database\Type\TimeType;
use App\I18n\FrozenTimeOnly;
TimeType::$dateTimeClass = FrozenTimeOnly::class;
// remove the default `useImmutable()` call, you may however
// want to keep further calls for formatting and stuff
Type::build('time');
// ...
これはほとんど自明であるはずです、time TimeTypeにマップされている列 、App\I18n\FrozenTimeOnlyを使用するようになります デフォルトのCake\I18n\Timeの代わりに 。
DateTimeType::$dateTimeClass 非推奨です
これに対処するには、カスタムデータベースタイプが必要になりますが、これもかなり単純です。
src / Database / Type / TimeOnlyType.php
namespace App\Database\Type;
use App\I18n\FrozenTimeOnly;
use Cake\Database\Type\TimeType;
class TimeOnlyType extends TimeType
{
public function __construct($name)
{
parent::__construct($name);
$this->_setClassName(FrozenTimeOnly::class, \DateTimeImmutable::class);
}
}
親コンストラクターが_setClassName()を呼び出すため、現在、これによりデータ/時間クラスが2回インスタンス化されることに注意してください。 また、特定のクラスのインスタンスがインスタンス化される場所でもあります。
src / config / bootstrap.php
use App\Database\Type\TimeOnlyType;
Type::map('time', TimeOnlyType::class);
つまり、これが行うことは、デフォルトのtimeをオーバーライドすることです。 カスタム\App\Database\Type\TimeOnlyTypeを使用するためのタイプマッピング クラス。これにより、\App\I18n\TimeOnlyが使用されます。 データベース値をPHPオブジェクトに変換するときのクラス。文字列に変換すると、時間のみの形式が使用されます。