LoginSignup
5
4

More than 5 years have passed since last update.

CakePHP3でChronosを使う

Last updated at Posted at 2016-03-11

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-dY-m-d H:i:sはそれぞれtoDateString()toDateTimeString()で出せます。

主観だけど、Timeより使いやすいかな〜。

5
4
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
5
4