CakePHP3でEntityからDate型のデータを日付計算して取得してみた。
日付の比較とか計算とかあまり好きではありません。
いつもグーグル先生にお申し立てをしてしまいます。
そんな自分が今回やったことはタイトルの通り。
■やりたかったこと
Date型のデータの1日前のデータを取得したかった。
■やったこと
Entityで計算した結果を返すようにした。
Entityのgetterでやりたかったんです。
実際に使う時はViewの方だったのですが、Viewにごちゃごちゃ書きたくなかったので。
結局、こんな風にしてみました。
<?php protected function _getPastSampleDate() { if (isset($this->_properties['sample_date'])) { return date('Y-m-d', strtotime('-1 day', strtotime($this->_properties['sample_date']->format('Y-m-d')))); } else { return ''; } }
strtotime辺りはよくある日付操作と同じです。
ただフォーマットを掛けて、1日分マイナスしているだけです。
使う時は普通のEntityと同じです。
<?php if ($sampleObject->past_sample_date > date('Y-m-d')) { // 何か処理 }
これでやりたいことができました。
そう言えば。
CakePHP3で開発する時、View側でdatetimepickerを使うと日付表示フォーマットが様子おかしくなります。
犯人はfrozentimeなのですが、これを回避したい時はconfig\bootstrap.phpに以下を書くといいです。
// 日付型フォーマットのデフォルト出力設定 \Cake\I18n\Time::setToStringFormat('yyyy-MM-dd HH:mm:ss'); \Cake\I18n\FrozenTime::setToStringFormat('yyyy-MM-dd HH:mm:ss'); \Cake\I18n\Date::setToStringFormat('yyyy-MM-dd'); \Cake\I18n\FrozenDate::setToStringFormat('yyyy-MM-dd');
\Cake\I18n~の部分はuseしてしまっても構いません。
今回は便宜的にベタっと書いておきました。
公式の方はJson出力のサンプルが書いてありますが、同じような感じです。
http://book.cakephp.org/3.0/ja/core-libraries/time.html#id3book.cakephp.org