2011-07-09 13 views
9

レールで日付とタイムゾーンを処理するための最良の方法は何ですか?レールと日付は、デフォルトでUTCで保存されていますか?

Scenerio:私は世界各地のWebサイトで商品を購入している顧客を持っており、ログインすると彼らのタイムゾーンを選択することができます。

私はUTCでデータベースにすべてを格納する必要があると考えています。フロントエンドでは、ユーザーにタイムゾーンの設定を変更する必要があります。

RubyとRailsとdatetimesなどで何か問題がありますか?

私はレールが初めてのので、これを適切に処理する方法のガイダンスを探しています。

+0

:すべてをUTCとして記録します。あなたの質問は何ですか? – apneadiving

+0

は、アクティブレコードではデフォルトでUTCのものを保存しますか? – Blankman

+0

申し訳ありませんが、タイトルには... – apneadiving

答えて

11

幸運にも、Railsはあなたのために物事を処理します。他の人が指摘するように、日付はARによってUTC形式で保存されます。あなたはユーザーテーブル用time_zoneフィールドを持っている場合は、このような何かを行うことができます。

# application.rb 
config.time_zone = "Mountain Time (US & Canada)" # Default time zone 

-

# application_controller.rb 
before_filter :set_time_zone, :if => :logged_in? 

protected 
def set_time_zone 
    Time.zone = current_user.time_zone if current_user.time_zone 
end 

すべての日付時刻は、あなたの意見では、適切なタイムゾーンで表示されなければなりません。

デフォルトのタイムゾーンを使用したくない1つのプロダクションアプリがありましたが、実行していたRails/Rubyのバージョンがわかりません。

+0

ありがとう、うまくいけば、まっすぐに見えるようにすべてを理解した!今すぐお金/通貨の問題のために:) – Blankman

+1

@Blankman:お金/通貨の問題については、私の答えはこちらを参照してください:http://stackoverflow.com/questions/4798651/rails-money-gem-convertts-all-amounts-to-zero/4800159#4800159 – apneadiving

1

あなたのconfig/application.rbファイルを見てください。

あなたはコメント行を見つける必要があります:

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 
# config.time_zone = 'Central Time (US & Canada)' 

ので、デフォルトではUTCですが、そこに必要なものは何でもOUに設定することができます。

1

はい、そうです。アプリでは、ユーザーの日時を表示するたびに、タイムゾーンオフセットを追加するだけです(例:GMT + 1の場合はdate + 1.hour)。あなたは夏時間の世話をする必要があることを忘れないでください。効率を上げるために、ユーザーテーブルにtimezoneとtime_offsetという2つの列を追加することを検討してください。そして、あなたはそれぞれのケースの場合と

= @order.created_at + session[:user].time_offset 

の代わりに、常にチェックするプロファイルに設定された各タイムゾーンのオフセットのような何かをします。

+0

私は混乱しています、あなたは2つの列を持っていると言っていますが、あなたのコードはタイムゾーン列を参照していません。 – Blankman

+0

これは持っていないことを意味します。ユーザーがプロフィールを編集するときは、タイムゾーンを使用します。これは「人間にやさしい」名前です。ユーザーがそれを更新すると、それをタイムゾーンとオフセットの表と比較し、time_offsetを設定してオフセットを再度取得しないようにします。 – exine

+0

さて、オグズのウィザードがより良い解決策を提案しているのを見ると、Railsにはそれがあるとは知らなかった;) – exine

0

私は実際に有用であることが

rake time:zones:all 

を見つけました。オフセットのリストとその下のゾーン名文字列を表示します。例えば:

* UTC +12:00 * 
Auckland 
Fiji 
Kamchatka 
Magadan 
Marshall Is. 
Solomon Is. 
Wellington 

私は(「山岳部時間(米国&カナダ)」のない直感的な与えられたデフォルトのタイムゾーンの文字列)application.rbに以下の必要:あなたが説明するように、私は正確にやるだろう

config.time_zone = 'Wellington' 
関連する問題