ローカル環境ではちゃんと動いていたのに、公開サーバーにアップすると時刻がずれる・・・毎回のように発生しませんか?
ちょうど9時間くらいずれてるから、タイムゾーンの設定なんだろうな~というのはわかるんですけどね。。
一回設定してしまえばOKなので久々にずれると、どこを修正するんだったかどうやって確認するんだったかすぐ忘れてしまうのでメモしておきます。

前提

  • CakePHP3.6
  • PHP5.6
  • MySQL5.7

CakePHP3.6から、けっこう変わりましたね。いままで使ってたメソッドが名前変わったり・・・session() → setSession()/getSession()みたいな置き換えとか。
今回のタイムゾーン設定に関係する記述も、CakePHP3当時とはすこし変わっていました。

時刻がずれたときに確認する箇所

時刻のずれって、エラーではないんですよね・・・設定なので。
何か更新した時に「modifiedの時刻がずれてるんだけどなんで」と気が付くわけです。エラーだったらエラーメッセージをヒントに調べていけるんですけどね・・・標準がUTCなので、日本人は日本人設定が必要になります。
ローカルで動いていたのにサーバーで動きが違うという場合は、調べるのは余計に大変です。

時刻設定といえばタイムゾーン。いろんな箇所にちらばっているので確認していきます。

  • PHPのタイムゾーン設定
  • MySQLのタイムゾーン設定
  • CakePHPのタイムゾーン設定

それぞれ設定方法や確認の仕方が全然違うのでこれがまた面倒です。

PHPのタイムゾーンを確認・設定する

PHPのタイムゾーンはphpinfo()で確認できます。

<?php phpinfo(); ?>

「date.timezone」で検索すると、今の設定がどうなっているか見れると思います。「Asia/Tokyo」でなけれなばphp.iniを変更しましょう。

MySQLのタイムゾーンを確認する

MySQLのタイムゾーンを調べようと思ったのですが、レンタルサーバーだからか検索して出てくる調べ方が使えなくてよくわかりませんでした^^;
とりあえず時刻がずれているのかどうかを現在時刻を表示して確認してみました。

SELECT NOW();

これで表示された時間がずれていなければ、MySQLは大丈夫なんだろうということでCakePHPの設定に進みます。
(ずれてたら、MySQLのタイムゾーンを修正しましょう)

CakePHPのタイムゾーンを確認・設定する

設定箇所は「app.php」に2箇所あります。
CakePHP3.2くらいでは「bootstrap.php」にも設定箇所がありましたが、CakePHP3.6かちょっと前くらいに少し変わったようでapp.phpに集約されていました。

// app.php
'App' => [
   'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja_JP'),
   'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', '+09:00'),
],
'Datasources' => [
    'default' => [
        'timezone' => '+09:00',
    ],
],

「App」「Datasources」の該当箇所を修正します。私の場合、Datasourcesは書き換えていたのですが、Appの項目がデフォルトのUTCになっていて時刻がずれていたようでした。
昔bootstrap.phpにあったタイムゾーン設定はこのAppの値を参照するようになっていたので、ここを変えたらCakePHP側の時刻設定はOKです。
「+09:00」と書いていますが「Asia/Tokyo」でもいいような気がします。何で数字の設定に変えたか思い出せないのですが、何かの都合でこっちがよくて変更したような・・・Googleカレンダー連携だったかな?忘れましたが必要に合わせて書き換えてください。

// bootstrap.php
date_default_timezone_set(Configure::read('App.defaultTimezone'));

ちなみにこうなっています。app.phpの設定値App.defaultTimezoneを使う指定ですね。
昔のバージョンでは、確かここにべた書きでタイムゾーンを指定していたので、古めのCakePHP3を使ってる方はご注意です。

おわり