datetime形式のフィールドのタイムゾーン

Rails 2.3.8 では、config/environment.rbのconfig.time_zoneをコメントアウトして使っていた。その結果として、データベースに格納されるdatetime形式の値は、Railsを動かしているサーバーの時間と一致していた。

Rails 3.0にしたら、config/application.rbのconfig.time_zoneをコメントアウトしても、しなくてもデータベースに格納されるdatetime形式の値は、UTC = 0で格納される。一方で、コメントアウトと「config.time_zone = Tokyo」とで、アプリケーション側で呼び出した値がUTCの値が変化する。

データーベース アプリケーション呼び出し
config.time_zoneをコメントアウト UTC 0 UTC 0
config.time_zone = Tokyo UTC 0 UTC +9 (JST)

さらに、モデル hogehogeのフィールド t.datetime start の表記方法によってもUTCの値が変化する。Viewにおいて、@hogehogeにモデルhogehogeの値が入っているとしたとき、以下のようになる。

@hogehoge['start'] UTC 0
@hogehoge.start UTC +9 (JST)

いまいち原理がわからないけど、現象は以下のとおり。

  1. config.time_zoneで設定したタイムゾーンは、アプリケーション側で呼び出す際に適用される。
  2. データベースに格納されているときのタイムゾーンUTC = 0で統一されている。

以上より、config.time_zoneで設定したタイムゾーンは、アプリケーション側で呼び出す際に適用されるので、データベースに格納されている日付をRailsメソッドを経由しないで呼び出さないようにするべし