エンティティの日時のフィールド
Date型、DateTime型のフィールドにデータをセットすると、
Cake\I18n\FrozenDate
またはCake\I18n\FrozenTime
のオブジェクトに変換される。
// エンティティのDateTime型フィールドを出力すると
// debug($entity->dt_field);
object(Cake\I18n\FrozenTime) {
'time' => '2022-10-15 00:00:00.000000+09:00'
'timezone' => 'Asia/Tokyo'
'fixedNowTime' => false
}
DBから取得した際も同様のオブジェクトとなる。
FrozenTimeってなに
組み込みの DateTime クラスを拡張し、便利なメソッドやロケールを考慮したフォーマットヘルパーを提供する
Class FrozenTime | CakePHP 4.4
日付と時刻 - 4.x
要は日時を便利に扱えるオブジェクトらしい。
書式出力
デフォルト出力
フィールドをそのままechoすると、デフォルト書式で出力される。
(マジックメソッド__toString()
で出力が実装されている)
echo $entity->dt_field;
// 2022/09/01 0:12
同様の出力をするにはnice()
でも可。
echo $entity->dt_field->nice();
// 2022/09/01 0:12
このときのデフォルト書式は、ロケールによって決まっている。
フォーマットを指定する
デフォルト以外のフォーマットを指定するには、以下の通り。
その時の出力だけ変更する場合はi18nFormat()
。
echo $entity->dt_field->i18nFormat('yyyy-MM-dd');
// 2022-09-01
またはsetToStringFormat()
。
これはデフォルト書式自体を変更するstaticメソッドなので、一度実行するとその後のすべてのデフォルト書式出力はこのフォーマットが使用されることになる。
FrozenTime::setToStringFormat('yyyy年MM月dd日 HH:mm:ss');
echo $entity->dt_field;
// 2022年09月01日 00:12:34
echo $entity->dt_field2;
// 2022年10月01日 01:23:45
これらの書式を設定する際は、フォーマット書式は組み込みのdate()
で使用する書式('Y-m-d'
など)ではなく、IntlDateFormatter
の書式であること。
PHP: IntlDateFormatter - Manual
フォーマット詳細
Formatting Dates and Times - ICU Documentation
特定の書式で出力
定型出力のメソッドもある。
以下はMySQLなどで使うdate('Y-m-d H:i:s')
の形に出力する。
echo $entity->dt_field->toDateString();
// 2022-10-01
echo $entity->dt_field->toDateTimeString();
// 2022-10-01 00:12:34
ほか、様々な固定の出力形式がある。
apiで「toXXXString()」のメソッドを探すといろいろある。
日時操作
ほか、日時比較や計算など便利な関数がたくさんある。
CakePHP3のChronosの機能紹介 - Qiita