Rails 3 で RDBに書かれる時間を日本時間にするには
現在 Ruby on Rails 3.0 であるサービスを作っていますが、 Rails 2.X と違い RDB に書かれる時間が UTC (協定世界時) でかかれます。 国際対応する予定のアプリならこれで良いのですが、日本向けのサービスの場合はメンテナンス性を考えると RDB には日本時間(JST)で書かれた方が良いので対応しようとしたところ一筋縄では行きませんでした。
Railsの設定 config/application.rb (Rails2の config/environment.rb に対応するファイル)に、コメントアウトされた config.time_zone = 'Central Time (US & Canada)' という設定があったので
config.time_zone = 'Tokyo'
としてみましたが、なぜかまだUTCで動作しています? rails3 time_zone で検索してみると色々と出てきます。そこに、 ActiveRecord が自動的に UTC に変換すると書かれていました。これを止めるには以下のように設定します。
config.time_zone = 'Tokyo' config.active_record.default_timezone = :local
これで、日本時間(JST)でRDBに書かれるようになったのですが、なぜか to_s(:db) (例 user.created_at.to_s(:db)) は UTC に変換されていまいます ?? この原因は解らなかったので Time::DATE_FORMATS[:db_l] = "%Y-%m-%d %H:%M:%S" を config/initializers/constants.rb に定義して user.created_at.to_s(:db_l) として回避しました。
それから、 String, Date,Time などに追加されるメソッド to_time もデフォルトでは UTC を戻すのですね、 to_time(:local) と書けば日本時間になります。
一応、これで日本時間で動作しているようですが、このやり方で正しいのかな?
現在使っている Railsは 3.04、 Ruby 1.8.7、RDB は PostgreSQL 9.0.2 です。