- クエリビルダで
DATE
型のフィールドを取得すると、Cake\I18n\FrozenDate
オブジェクトが返される - 同じく、
DATETIME
型を取得すると、Cake\I18n\FrozenTime
オブジェクトが返される
サンプル
var_dump( $query->find()-> .... ->get('field_date') ); //field_date = DATE 型のフィールド ↓ // Cake\I18n\FrozenDate オブジェクトが返される object(Cake\I18n\FrozenDate)#2802 (3) { ["time"]=> string(25) "2019-11-07T00:00:00+00:00" ["timezone"]=> string(3) "UTC" ["fixedNowTime"]=> bool(false) }
ドキュメントより抜粋
3.2 移行ガイド - 新しいイミュータブルな Date と Time オブジェクト
3.2 では、ORM は イミュータブルオブジェクトと date/datetime カラムをマッピングすることができます
date この型の戻り値は、ネイティブな DateTime クラスを拡張した Cake\I18n\Date です。
デフォルトでイミュータブルオブジェクトが有効になります
備考: Cake\I18n\FrozenDate
オブジェクトから日付を取得する方法
- Cake\I18n\Time::i18nFormat を使う
FrozenTime および FrozenDate クラスは Time オブジェクトが持っているのと同じ API を提供しています - See: 3.2 移行ガイド - 新しいイミュータブルな Date と Time オブジェクト
- こんな感じ
$query->find()-> .... ->get('field_date')->i18nFormat('yyyy/MM/dd');
ハマった事: フォーマットの指定は大文字の YYYY でなく、小文字の yyyy
- DATE 型の
2199/12/31
を...->i18nFormat('YYYY/MM/dd')
すると2200/12/31
になってしまいハマった...->i18nFormat('yyyy/MM/dd')
としないと意図した動作をしない
- 参考になったエントリー
2019/12/15 追記
こっちのほうがシンプル
$query->find()-> .... ->get('field_date')->toDateString()
$query->find()-> .... ->get('field_date')->toDateTimeString()
// app/vendor/cakephp/chronos/src/Traits/FormattingTrait.php trait FormattingTrait { /** * Format the instance as date * * @return string */ public function toDateString() { return $this->format('Y-m-d'); }