またどこかでCTOっぽいことやってる人のブログ

フリーランスを経て、またどこかでCTOっぽいことをやってる人が書いてます。何か色々やってます。

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