回答:
DateTimeクラスのin_time_zoneメソッドを使用する
Loading development environment (Rails 2.3.2)
>> now = DateTime.now.utc
=> Sun, 06 Sep 2009 22:27:45 +0000
>> now.in_time_zone('Eastern Time (US & Canada)')
=> Sun, 06 Sep 2009 18:27:45 EDT -04:00
>> quit
あなたの特定の例のために
Annotation.last.created_at.in_time_zone('Eastern Time (US & Canada)')
created_at.in_time_zone("EST")
より短い
これは古い質問ですが、何か言及する価値があります。で、前の回答には、一時的にタイムゾーンを設定するためにbefore_filterを使用することを示唆しています。
Time.zoneは情報をスレッドに格納しているため、このようなことは絶対に行わないでください。そのスレッドが処理する次のリクエストにリークする可能性があります。
代わりに、around_filterを使用して、リクエストの完了後にTime.zoneが確実にリセットされるようにする必要があります。何かのようなもの:
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
これについての詳細を読むここで
これをあなたに追加した場合 /config/application.rb
config.time_zone = 'Eastern Time (US & Canada)'
その後、あなたは携帯することができます
Annotation.last.created_at.in_time_zone
指定されたタイムゾーンの時刻を取得します。
タイムゾーンを東部時間に設定します。
デフォルトのタイムゾーンはconfig / environment.rbで設定できます
config.time_zone = "Eastern Time (US & Canada)"
これで、プルしたすべてのレコードがそのタイムゾーンになります。異なるタイムゾーンが必要な場合、たとえばユーザーのタイムゾーンに基づいて、コントローラーのbefore_filterで変更できます。
class ApplicationController < ActionController::Base
before_filter :set_timezone
def set_timezone
Time.zone = current_user.time_zone
end
end
すべての時間をUTCとしてデータベースに保存していることを確認してください。
Time.zone=
スレッドセーフなgithub.com/rails/rails/blob/master/activesupport/lib/…です。
now.in_time_zone(3)