2010-12-06 20 views
28

私はかなり一般的な問題を抱えていますが、何らかの理由で私はウェブ上のすべての提案を試してみたものの、何も動作していないようです。レール付きタイムゾーン3

私は「EST」

config.time_zone = 'Eastern Time (US & Canada)' 

しかし、時間が画面に表示されたとき、それはDBに格納されたUTC時刻を示し続けるに設定してタイムゾーンを設定しています。私は、デバッガを試してみましたが、ここでは出力

(rdb:1) Time.zone 
#<ActiveSupport::TimeZone:0x1061f4760 @utc_offset=nil, @current_period=nil, @name="Eastern Time (US & Canada)", @tzinfo=#<TZInfo::TimezoneProxy: America/New_York>> 
(rdb:1) Order.first.placed_at 
Fri Jan 01 15:00:00 UTC 2010 

アップデートです: をここに同じ質問 Rails timezone is wrong when shown

+0

タイムゾーンの詳細を:http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html –

答えて

36

in_time_zoneを試してみてくださいを持つ別のユーザーです。たとえば、

>> Time.now 
=> Sun Dec 05 21:34:45 -0500 2010 
>> Time.zone 
=> #<ActiveSupport::TimeZone:0x1033d97b8 @name="Pacific Time (US & Canada)", @tzinfo=#<TZInfo::DataTimezone: America/Los_Angeles>, @utc_offset=-28800, @current_period=nil> 
>> Time.now.in_time_zone 
=> Sun, 05 Dec 2010 18:34:54 PST -08:00 

あなたの場合は、Order.first.placed_at.in_time_zoneが必要です。

+4

しかし、私はタイムゾーンでの設定と思いましたconfigは自動的にactiverecordにローカルタイムゾーンで取得するよう指示します.. http://ryandaigle.com/articles/2008/1/25/what-s-new-in-edge-rails-easier-timezones – Addy

+0

私の経験では、 UTCではなくローカルタイムゾーンを使用するように明示的にビューに指示する必要がありました。おそらくよりよい方法が存在するでしょう。 –

+0

これは私を夢中にさせていた。ありがとう、トン! :-) –

2

ActiveRecord::Base.time_zone_aware_attributesがtrueであることを確認してください。私は何を記述していることは、このバグだと思う

11

あなたがにしたい場合は、あなたのアプリのユーザごとに異なるタイムゾーンを設定し、前フィルタとは対照的に、あなたがaround_filterを使用してくださいTime.zoneを変更します。 Time.zoneが他のスレッドにどのように漏れているのかと関係しているので、他のユーザーがタイムゾーンを設定することはできません。 application_controller.rbでhttp://ilikestuffblog.com/2011/02/03/how-to-set-a-time-zone-for-each-request-in-rails/

:このブログの記事から

around_filter :set_time_zone 

private 

def set_time_zone 
    old_time_zone = Time.zone 
    Time.zone = current_user.time_zone if logged_in? 
    yield 
ensure 
    Time.zone = old_time_zone 
end 

私はまた、ユーザーが自分のタイムゾーンを変更することができたときに、それが参考にtime_zone_selectフォームヘルパーメソッドを使用することを発見しました。フィールド:time_zoneを呼び出した場合は、次のように使用します。

f.time_zone_select(:time_zone) 

最後に、これはかなり素晴らしいようです。 自動検出とタイムゾーンの設定はjavacriptで行います。 https://github.com/scottwater/detect_timezone_railsと関連するブログポスト::ここでは、アセットパイプラインに追加するレールの逸品ですhttp://www.scottw.com/automated-timezone-detection

+0

完璧な答えは、私に尋ねる! – pungoyal