RailsでRDSを利用する時のタイムゾーンの設定など

RDSについてはMySQLのタイムゾーンの指定ができないようだ。

残念ながらRDSのシステム設定上のタイムゾーン (default_time_zone)はUTC固定となり、変更する事はできません。
クライアントからアクセスする際に適宜

mysql> SET SESSION time_zone="Asia/Tokyo"; 

などとして設定してお使い下さい。

https://forums.aws.amazon.com/thread.jspa?threadID=63355

2011年3月の情報ではあるけど、現在でもAWS Management Consoleで変更できなかった。

というわけでセッションの度に

SET SESSION time_zone="Asia/Tokyo";

をやりたいのだけど、それをRuby on Railsでやる方法を探した。

タイムゾーンではないけど、セッションパラメータを変えたいという人がいたようで、対応してくれていた。

Add ‘set_session:’ param to database.yml for mysql and mysql2 adapters

紆余曲折があった後、結局 variables という名前で落ち着いた様子。そこで、database.ymlは下記のようになる。

weatherdb:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: ****
  pool: 5
  username: *****
  password: *****
  host: ******.******.ap-northeast-1.rds.amazonaws.com
  variables:
    time_zone: Asia/Tokyo

これで接続時に

SET @@SESSION.time_zone = "Asia/Tokyo";

をやってくれるようになる。

あとは、application.rbで

config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local

としておけば、正しい時間を返してくれるようになった。

ちなみにRails 4.0 beta1でも上記でちゃんと動いた。