Rails(2.1.0)のtimezone
Rails(2.2.2)が11/21にリリースされたのはわかっていますし、インストールも終わっているんですが、Rails(2.1.0)の話です。
timezone
config/environment.rbというファイルに config.time_zoneという指定があって、これを'Tokyo'にすると幸せが来そうな感じがするじゃないですか。しませんか?
config.time_zone = 'Tokyo'
config/environment.rb
で、やってみたわけです。そうすると確かに日本のローカルタイムになって、OK、OKというわけなんですが、MySQLの DBの中を見てあらびっくり。DBに書かれている DateTimeは UTCのままです。ググってみると、これだけじゃ足りないと。
config.time_zone = 'Tokyo'
config/environment.rb
config.active_record.default_timezone = 'Tokyo'
これもいるよと。ふーーんですね。で、DBみたらちゃんと Tokyoローカルになってたので安心したんですが、ちょっと待てよと。created_atとか updated_atなんかはちゃんとローカルだけと、activated_atはまだ UTCだ。
認証系
認証系のプラグインとして、restful-authenticationとか aasmを使っているんですけど、このなかの日付は「Time.now.utc」決め打ちになっていて、time_zoneには関係ないよと。ま、プラグインのなかで閉じてる分には UTC決め打ちの方が間違いがなくていいんだろうけど、いつアクティベートしたかを表示したくなることだってあるかもしれないし。いちいち、これは認証系だから UTCから Localへ変換して、とかやってるといつか間違いそうだし、どうすべぇか。
ということで、プラグインに手を入れて、'.utc'を全部取っちゃおうと思ったんですけど、10箇所くらい変更するところがあって、なんかいやーな感じがしたのでいったん変更したのを戻してしまいました。
結論
#config.time_zone = 'Tokyo'
config/environment.rb
#config.active_record.default_timezone = 'Tokyo'
time_zoneの指定をしないと DBを含めて、デフォルトでローカルタイムになるので、なにも指定しないこと。
認証系は UTCだということを忘れないようにして、activated_atや remember_token_expires_atを使うときはローカルに変換してから使うこと。
参考
- よりシンプルに日付と時刻の表示書式を整えるには... - ザリガニが見ていた...。
この通りにやろうとして今回のことに。やるやらないは自己責任で。
記事自体は相変わらず親切で詳しいです。 - Ruby On Rails ピチカート街道 - Rails 2.1・その12(DBに登録してあるUTC日付データを簡単変換) -
- RailsでUglyになんとかTimeZoneをサポートする -- BONNOH FRACTION 14