- 更新日: 2014年4月3日
- Rails
Rails でのタイムゾーン管理の方針
国際化を行う Rails アプリケーションの場合で、ユーザーのタイムゾーンを管理する方針を考えたのでまとめておきます。
— 環境 —
Rails 4.0.1
時刻は UTC に統一して DB に保存
まず、時刻は全て UTC で統一してデータベースに保存。ここがバラバラのタイムゾーン時刻で保存されると破綻します。Rails は created_at, updated_at など時刻カラムへの保存は、デフォルトで UTC となるようです。
独自に作成した datetime 型カラムに時刻を保存する場合は、UTC に変換してから保存する。Ruby の Time#utc メソッドを使います。
1 2 3 4 5 6 |
pry(main)> Time.now => 2014-04-01 14:02:07 +0900 pry(main)> Time.now.utc => 2014-04-01 05:02:12 UTC |
独自の datetime 型カラムでも Rails が自動で UTC に変換するのかな?未確認なので分かりませんが、とにかく時刻の保存は全て UTC で。
時刻を出力する際はユーザーのタイムゾーンに合わせる
User モデルには、タイムゾーンを保存する属性(DBテーブルのカラム)を持たせます。ここでは、time_zone カラムがあると前提。
1 |
<%= @post.created_at.in_time_zone(@user.time_zone).to_formatted_s(:without_second) %> |
in_time_zone(@user.time_zone) で、ユーザーのタイムゾーンに応じた時間を取得。これで @user.time_zone が Tokyo であれば、UTC 時刻からプラス9時間された時刻が出力されます。
またここでは、Rails で時間・時刻表示の独自フォーマットを作成する | EasyRamble で作成した、独自のフォーマット :without_second を使っています。
国際化アプリケーションの場合は、以上の方針でタイムゾーンを管理していこうと考えました。
- – 参考リンク –
- class Time
- Time
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!