Railsでの時間管理はUTCで

RailsのTimeクラスは拡張されているので,zoneメソッドが利用できます.
※標準のTimeクラスでは,undefined method でエラーがでます.

irb:0> Time.zone
=> (GMT+00:00) UTC

これは,config/application.rbで,
config.time_zone = 」で指定するのですが,デフォルトは「UTC」です.
ここで,「Tokyo」とかに変えても良いのですが,ActiveRecordによって,DBに保存される日時はUTCみたいなのです...

どうやら,Railsで日時はUTCで管理した方が良さそうで,表示する際にローカル時刻(JST)に変換するというやり方の方が良さそうです.

例えば,users テーブルに,「start_time」というDATETIME型のフィールドを作成されているとき,

user = User.find(1)
user.start_time = Time.now.utc.to_s(:db)
user.save

と,強制的にUTCで “2013-01-16 05:30:00” というようにデータベースの日付型に合わせた形で現在のUTC日時を代入します.

irbにて,テーブルのフィールドの値を確認すると...

irb:0> user = User.find(1)
irb:0> user.start_time
=> Wed, 16 Jan 2013 05:30:00 UTC +00:00

ちゃんとUTCで入っています.
そして,このオブジェクト型は,何なのかを確認します.

irb:0> user.start_time.class
=> ActiveSupport::TimeWithZone

Timeクラスでは無いんですね...

んでもって,ローカル時間に変換したい場合はその都度,in_time_zoneメソッドを使用するようにします.

irb:0> user.start_time.in_time_zone('Tokyo')
=> Wed, 16 Jan 2013 14:30:00 JST +09:00

時間計算も記録も全てUTCで,表示するときだけJSTに変換する,そういう方針で行きたいと思います.

コメントを残す