shimgo
10/9/2016 - 6:41 AM

railsとDBサーバのタイムゾーンの違いによるデータ格納時の挙動について

railsとDBサーバのタイムゾーンの違いによるデータ格納時の挙動について

###railsのタイムゾーン設定

  • railsで日付を解釈するときのタイムゾーン
config.time_zone = 'Tokyo'

TimeWithZone型はこの設定を使用する。 Active RecordはTimeWithZone型を使用するため、Active Recordの設定とも言える。
なお、Ruby組み込みのTime型もTimeWithZone型に変換される。

  • データベースに書き込むときのタイムゾーン
config.active_record.default_timezone = (:utc or :local)

これはDBに登録・参照参照するときにTime.utcで扱うかTime.local(システムのタイムゾーン)で扱うかの違いになる。
ただし、Active RecordではRuby組み込みのTimeもTimeWithZone型で扱うため、システムがJST、config.time_zoneがJST、DBに格納されているのがJST、config.active_record.default_timezone = :utc だとDBの値をUTCで読み取り、Active RecordのインスタンスはUTCをJSTに変換して保持となる。
書き込みの際にはJSTをUTCに変換してDBに格納するため、DB側がタイムゾーンを持たない型(MySQLのdatetime型など)だと、たとえDBサーバをJSTに設定していても格納されるのはUTCになる

###まとめ config.active_record.default_timezoneは、DBのタイムゾーンと一致させておくべき。
DBのタイムゾーンがUTCなら:utcにDBのタイムゾーンがSYSTEMなら:localにしておく。