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に変換する,そういう方針で行きたいと思います.
コメントを残す