web-dev-qa-db-ja.com

Railsでタイムゾーンを別のタイムゾーンに変換する

僕の 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
101
Tom Lehman

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)')
185
Steve Weet

これは古い質問ですが、何か言及する価値があります。 前の返信 では、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

17
opsidao

これを/config/application.rbに追加すると

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

その後、セルすることができます

Annotation.last.created_at.in_time_zone

指定されたタイムゾーンの時間を取得します。

8
Eifion

タイムゾーンを東部標準時間に設定します。

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としてデータベースに保存していることを確認してください。すべてがうまくいきます。

2
nitecoder

/config/application.rbを設定する場合

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

Time.now.in_time_zone

DateTime.now.in_time_zone
2
Dorian