日付/時刻の値はすべて同じ基本構造、つまりDateTime
にキャストされています またはDateTimeImmutable
オブジェクトであるため、当然、日付のみの値には時間値が追加されます(00:00:00
)、および時間のみの値には日付(現在の日付)が付いています。
CakePHPは、SQLデータ型に応じて特定のサブクラスを使用します。つまり
-
\Cake\I18n\Time
または\Cake\I18n\FrozenTime
TIME
の場合 、TIMESTAMP
、およびDATETIME
-
\Cake\I18n\Date
または\Cake\I18n\FrozenDate
DATE
の場合
以前の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オブジェクトに変換するときのクラス。文字列に変換すると、時間のみの形式が使用されます。