UTC Time
またはTimeWithZone
をRails 3.の現地時間に変換するのに問題があります。
moment
は、UTCのTime
変数です(例:moment = Time.now.utc
)。 moment
をタイムゾーンに変換し、DSTを処理する(つまり、EST/EDTを使用する)にはどうすればよいですか?
より正確には、今朝の午前9時(東部夏時間)に対応する場合は「月曜日3月14日午前9時」、昨月の午前9時(東部標準時)には「月曜日7月9日午前9時」を印刷します。
うまくいけば別の方法がありますか?
Edit: 最初に考えた 「EDT」は認識されたタイムゾーンである必要があるが、「EDT」は実際のタイムゾーンではない、タイムゾーンの状態に似ています。たとえば、Time.utc(2011,1,1).in_time_zone("EDT")
を要求しても意味がありません。 「EST」は実際のタイムゾーンであり、夏時間を使用していない(UTC- 5)一年中。
Railsには独自の名前があります。でそれらを参照してください:
rake time:zones:us
すべてのタイムゾーンでrake time:zones:all
を実行することもできます。その他のゾーン関連のレーキタスクを表示するには:rake -D time
したがって、ESTに変換するには、DSTに自動的に対応します。
Time.now.in_time_zone("Eastern Time (US & Canada)")
Time#localtime
は、コードを実行しているマシンの現在のタイムゾーンの時間を提供します。
> moment = Time.now.utc
=> 2011-03-14 15:15:58 UTC
> moment.localtime
=> 2011-03-14 08:15:58 -0700
更新:自分のタイムゾーンではなく、特定のタイムゾーンに変換したい場合、あなたは正しい軌道に乗っています。ただし、ESTとEDTを心配する代わりに、一般的な東部標準時を渡すだけです。EDTかESTかは、その日に基づいてわかります。
> Time.now.utc.in_time_zone("Eastern Time (US & Canada)")
=> Mon, 14 Mar 2011 11:21:05 EDT -04:00
> (Time.now.utc + 10.months).in_time_zone("Eastern Time (US & Canada)")
=> Sat, 14 Jan 2012 10:21:18 EST -05:00
実際には、basecampによってlocal_time
と呼ばれるNice Gemがあり、それらすべてをクライアント側でのみ行うことができます。
システムのローカルゾーンを使用して簡単に設定できます。application.rbに追加してください
config.time_zone = Time.now.zone
次に、Railsはローカルタイムのタイムスタンプを表示するか、この手順のようなものを使用してローカルタイムを取得できます
Post.created_at.localtime
理由はわかりませんが、私の場合、以前に提案された方法では機能しません。ただし、次のように機能します。
Time.now.change(offset: "-3000")
もちろん、offset
の値を自分のものに変更する必要があります。
ユーザーのタイムゾーンを取得したいという理由だけで実際に実行している場合は、config/applications.rb
のタイムゾーンを変更するだけです。
このような:
デフォルトでは、Railsは、現在のタイムゾーンを指定しても、UTCでタイムレコードを保存します。
config.time_zone = "Singapore"
これがあなたがしなければならないすべてであり、あなたは行ってもいいです。