しょぼしょぼプログラマ雑記

自分のための備忘録。 開発記録など掲載してます。 質問・ご意見・ご感想等はTwitter ( https://twitter.com/yun_hokuto ) までお気軽にどうぞ。

CakePHP3での日時フォーマットとタイムゾーン対応について

ついにCakePHP3が正式にリリースされましたね

タイムゾーンについてCakePHP3では比較的簡単になっていました

MySQL(MariaDB)でDatetime型にて作成し、bakeをすると簡単に作成日時等を使うことが出来ます

その際のタイムゾーンはconfig/app.phpにて設定されているタイムゾーンになるかと思います

取得する際も通常通りfindをしてくるとそのままのデータが取れてきます

Datetime型の場合は「Cake\I18n\Time」型として取得ができますので、こちらをフォーマットすれば日付が表示できます

<?php

echo $tableObj->created->format('Y/m/d H:i:s');

// または

echo $tableObj->created->i18nFormat('YYYY/MM/dd HH:mm:ss');
// コチラの方が推奨されています

// ex) 2015/01/01 00:00:00

これらにタイムゾーンを追加すると下記のようになります

<?php

echo $tableObj->created->timezone('Asia/Tokyo')->format('Y/m/d H:i:s');

// または

echo $tableObj->created->i18nFormat('YYYY/MM/dd HH:mm:ss', 'Asia/Tokyo');
// コチラの方が推奨されています

// ex) 2015/01/01 09:00:00

これで登録されていた日時に対してタイムゾーンを適用した日時が出力できます

※疑問点

自分の使い方が間違っているのか、CakePHP3の不具合なのか、PHPの不具合なのかわかりませんが

1レコード内に登録されている全く同じ時刻データを同じタイムゾーンにて設定してみたのですが、

2つ目のデータがなぜか+1時間されてしまいました

原因が不明なのでちょっと謎です・・・

※追記

どうやらサマータイムが計算されているようです

これに気づくのに時間がかかりましたが、解決できたっぽいのでよかったです