僕の created_at
タイムスタンプはUTCで保存されます:
>> Annotation.last.created_at
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00
それらの1つを「夏時間を考慮して」「東部標準時(米国およびカナダ)」に変換するにはどうすればよいですか?何かのようなもの:
Annotation.last.created_at.in_eastern_time
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)')
これは古い質問ですが、何か言及する価値があります。 前の返信 では、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
これについてもっと読む here
これを/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としてデータベースに保存していることを確認してください。すべてがうまくいきます。
/config/application.rb
を設定する場合
config.time_zone = 'Eastern Time (US & Canada)'
Time.now.in_time_zone
DateTime.now.in_time_zone