CakePHP3.2で採用されたChronosを使ってみます。
Chronosは日時に関するライブラリです。
参考:
Cookbook 3.x Chronos
Cookbook 3.x Date & Time
今までTimeで書いていたものをChronosで書き換えてみます。
use Cake\I18n\Time;
public function getArticlesByDate($dateStr) {
$date = Time::parse($dateStr);
$date->hour(0)->minute(0)->second(0);
$this->log('getArticlesByDate:' . $date->i18nFormat('yyyy-MM-dd'));
$endDate = clone $date;
$endDate->addDay(1);
$query = $this->Articles->find('all', [
'conditions' => [
'created >=' => $date->i18nFormat('yyyy-MM-dd HH:mm:ss'),
'created <' => $endDate->i18nFormat('yyyy-MM-dd HH:mm:ss'),
]
]);
return ['date' => $date->i18nFormat('yyyyMMdd'), 'articles' => $query->all()];
}
↑これが
use Cake\Chronos\Chronos;
public function getArticlesByDate($dateStr) {
$date = Chronos::parse($dateStr);
$this->log('getArticlesByDate:' . $date->toDateString());
$endDate = $date->addDay(1);
$query = $this->Articles->find('all', [
'conditions' => [
'created >=' => $date->toDateTimeString(),
'created <' => $endDate->toDateTimeString(),
]
]);
return ['date' => $date->format('Ymd'), 'articles' => $query->all()];
}
↑こうなります。
少しすっきりしたかな。
Chronosはimmutable(不変)なオブジェクトなので、addDay()
とかしても元の値は変わらず、新しいオブジェクトを返します。
あと、時刻無しで日を指定すると、時刻は00:00:00になります。ただしCake\Chronos\DateなどのdateオブジェクトはタイムゾーンがUTCになるので、日付の比較をしたりする場合は注意が必要です。
(【追記・修正】 全部UTCになるのかと思ったのですが、bootstrap.phpでtimezoneを指定してあれば、時間を含むものは指定したtimezoneになっていました。)
formatもdate()
で指定する時の形なのでわかりやすい(私は)ですし、よく使うY-m-d
やY-m-d H:i:s
はそれぞれtoDateString()
とtoDateTimeString()
で出せます。
主観だけど、Timeより使いやすいかな〜。