0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CakePHPのEntityでの時刻の取り扱い

Posted at

エンティティの日時のフィールド

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

参考

CakePHP 4 で日時表示の初期フォーマットを設定する方法 / Twin Turbo Computing

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?