Pocket

【環境】

AWS RDS MySQL 5.5

【現象と要望】

AWSのRDSでMySQLサーバを起動し、日本時間2013-04-02 15:01 :00に "SELECT NOW();" を実行すると、"2013-04-02 06:01:00"と表示される。これを日本向けに"2013-04-02 15:01:00"と表示させたい。

【対応】

phpMyAdmin>変数を表示すると、time zoneはUTCであり、上記の「06:01:00」は正しい表示結果である。

time zoneを'Asia/Tokyo'または'+09:00'に設定すれば解決しそうだが、AWS Management Console>RDS>DB Parameter Groupsを見ると、default_time_zoneは変更不可と表示されている。

対応方法の一つとして、MySQLサーバ接続ごとに、またはSQL実行ごとに「SET @@time_zone='+09:00' 」を実行する方法がある。

cakePHP 1.2での対応例を紹介する。

※ソースそのままではなく記事用に編集してあるので、もしエラーが発生したら自分で対応してほしい。

【対応例】

(1) app/config/database.php

DATABASE_CONFIGのdriverの値をmysql_customに変更し、time_zoneを追加する。

class DATABASE_CONFIG {
     var $default = array(
         'driver'     => 'mysql_custom',  // ★ココと
         'persistent' => false,
         'host'       => 'localhost',
         'login'      => 'user',
         'password'   => 'pass',
         'database'   => 'cake',
         'prefix'     => '',
         'encoding'   => 'utf8',
         'time_zone'  => '+09:00',  // ★ココ
     );

(2) app/models/datasources/dbo_mysql_custom.php

ファイルを新規作成する。

<?php
uses('model' . DS . 'datasources' . DS . 'dbo' . DS . 'dbo_mysql');

class DboMysqlCustom extends DboMysql {
    function connect() {
         $r = parent::connect();
         if ($r) {
             if (isset($this->config['time_zone'])) {
                 $qry = sprintf("SET @@time_zone = '%s'", $this->config['time_zone']);
                 $this->query($qry);
             }
         }
         return $r;
     }
}