web-dev-qa-db-ja.com

Rails 3のタイムゾーン

私はかなり一般的な問題を抱えていますが、何らかの理由でWeb上のすべての提案を試しましたが、どれも機能しないようです。

設定でタイムゾーンを「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のタイムゾーンは表示されたときに間違っています

28
Addy

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が必要です。

36
Paul Schreiber

アプリのユーザーごとに異なるタイムゾーンを設定する場合、時間を変更するにはbeforeフィルターではなく、around_filterを使用してください。ゾーン。 Time.zoneが他のスレッドにリークする方法に関係しているため、他のユーザーは、自分がすべきでないタイムゾーンを継承している可能性があります。このブログ投稿から: http://ilikestuffblog.com/2011/02/03/how-to-set-a-time-zone-for-each-request-in-Rails/

application_controller.rb内:

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)

そして最後に、これはかなり素晴らしいです。 javascriptによってタイムゾーンを自動検出して設定します。 Rails gemをアセットパイプラインに追加するための宝石: https://github.com/scottwater/detect_timezone_Rails と付随するブログ投稿: http:/ /www.scottw.com/automated-timezone-detection

11
Danny

あなたのActiveRecord::Base.time_zone_aware_attributesはtrueです。

2
Duke

あなたが説明しているのはこのバグだと思います https://github.com/Rails/rails/issues/6816

0
joshnabbott