Rails でのタイムゾーン管理の方針

国際化を行う Rails アプリケーションの場合で、ユーザーのタイムゾーンを管理する方針を考えたのでまとめておきます。

スポンサーリンク

— 環境 —
Rails 4.0.1

時刻は UTC に統一して DB に保存

まず、時刻は全て UTC で統一してデータベースに保存。ここがバラバラのタイムゾーン時刻で保存されると破綻します。Rails は created_at, updated_at など時刻カラムへの保存は、デフォルトで UTC となるようです。

独自に作成した datetime 型カラムに時刻を保存する場合は、UTC に変換してから保存する。Ruby の Time#utc メソッドを使います。

独自の datetime 型カラムでも Rails が自動で UTC に変換するのかな?未確認なので分かりませんが、とにかく時刻の保存は全て UTC で。

時刻を出力する際はユーザーのタイムゾーンに合わせる

User モデルには、タイムゾーンを保存する属性(DBテーブルのカラム)を持たせます。ここでは、time_zone カラムがあると前提。

in_time_zone(@user.time_zone) で、ユーザーのタイムゾーンに応じた時間を取得。これで @user.time_zone が Tokyo であれば、UTC 時刻からプラス9時間された時刻が出力されます。

またここでは、Rails で時間・時刻表示の独自フォーマットを作成する | EasyRamble で作成した、独自のフォーマット :without_second を使っています。

国際化アプリケーションの場合は、以上の方針でタイムゾーンを管理していこうと考えました。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!