DEVELOPERS BLOGデベロッパーズブログ
- HOME >
- 加藤 正人のデベロッパーズブログ >
- CakePHP3 でタイムゾーン変換
加藤 正人のデベロッパーズブログ
- 氏名
- 加藤 正人
- 役職
- 多分SE
- 血液型
- 秘密
- 出没
- 美味しいもののあるところ
- 特色
- タヒチ大好き。ちょいメタボ。
- 2020/12/15
- CakePHP3 のリダイレクトがうまく行かない例
- 2020/11/12
- Apache Bench
- 2020/10/05
- PhpSpreadsheet でExcel ファイルを読み込む (CakePHP3)
CakePHP3 ではデータベースのタイムゾーン設定の既定値は UTC になっているが、PHP 環境やデータベース設定によってはタイムゾーンの設定を変更できない場合がある。
あるいは、クライアント側がタイムゾーンの異なる環境で使用される場合もある。
このような場合にデータベース側が日時としてタイムゾーン付き形式 ( 例えば '2020-02-02 12:34:56 JST' のような形式) をサポートしてくれるといいのだが、実際には MySQL などはそのような形式はサポートしていない。
このような場合、データベースは UTC で運用しクライアント側のタイムゾーンに日時を変換して表示することになる。
・データベース(UTC) ⇒ クライアント (Asia/Tokyo) 表示例
1 | $d = $table ->find()->first(); |
2 | echo $d [ 'created' ]->setTimeZone( 'Asia/Tokyo' )->format( 'Y-m-d H:i:s' ), "\n" ; |
※ $d['created'] が 2020-02-03 10:23:41 の場合、出力は 2020-02-03 19:23:41 になる
・クライアントからの入力 (Asia/Tokyo) ⇒ データベース (UTC) 変換例
1 | $form_data = '2020-02-12 06:33:24' ; |
2 | echo ( new Time( $form_data , 'Asia/Tokyo' ))->setTimeZone( 'UTC' )->format( 'Y-m-d H:i:s' ), "\n" ; |
※上記の場合出力は 2020-02-11 21:33:24 になる。
この変換は、UTC で保持される DateTime 型データに対し、ローカルタイムの年月日での絞り込みをする場合に重要である。何故なら UTC の1日の開始・終了時点とローカルタイムの1日の開始・終了時点は時差の分だけずれているため、SQL 文の絞り込み条件には日付そのもの (Y-m-d) ではなく時差を考慮した日付の切り替わり日時 (Y-m-d H:i:s) を指定する必要があるためである。
関連エントリー
- 2020/12/15
- CakePHP3 のリダイレクトがうまく行かない例
- 2020/10/05
- PhpSpreadsheet でExcel ファイルを読み込む (CakePHP3)
- 2020/08/03
- CakePHP3 のユーザー定義ファインダーのオプション
- 2020/05/07
- CakePHP3 で JSON 応答のための定番処理