web-dev-qa-db-ja.com

UTCをRails 3の現地時間に変換します

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)一年中。

90

Railsには独自の名前があります。でそれらを参照してください:

rake time:zones:us

すべてのタイムゾーンでrake time:zones:allを実行することもできます。その他のゾーン関連のレーキタスクを表示するには:rake -D time

したがって、ESTに変換するには、DSTに自動的に対応します。

Time.now.in_time_zone("Eastern Time (US & Canada)")
106
Zabba

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 
110
Dylan Markow

実際には、basecampによってlocal_timeと呼ばれるNice Gemがあり、それらすべてをクライアント側でのみ行うことができます。

https://github.com/basecamp/local_time

15
mahatmanich

システムのローカルゾーンを使用して簡単に設定できます。application.rbに追加してください

config.time_zone = Time.now.zone

次に、Railsはローカルタイムのタイムスタンプを表示するか、この手順のようなものを使用してローカルタイムを取得できます

Post.created_at.localtime
10
jacr1614

理由はわかりませんが、私の場合、以前に提案された方法では機能しません。ただし、次のように機能します。

Time.now.change(offset: "-3000")

もちろん、offsetの値を自分のものに変更する必要があります。

0
Seybo Glaux

ユーザーのタイムゾーンを取得したいという理由だけで実際に実行している場合は、config/applications.rbのタイムゾーンを変更するだけです。

このような:

デフォルトでは、Railsは、現在のタイムゾーンを指定しても、UTCでタイムレコードを保存します。

config.time_zone = "Singapore"

これがあなたがしなければならないすべてであり、あなたは行ってもいいです。

0
therealadrain