Rails 3でUTCを現地時間に変換する


95

Rails 3でUTC TimeまたはTimeWithZone現地時間に変換できません。

セイはmomentいくつかあるTimeUTC(例えば、変数moment = Time.now.utc)。momentDSTを処理して(EST / EDTを使用して)、タイムゾーンに変換するにはどうすればよいですか?

より正確には、時刻が今朝の午前9時EDTに対応している場合は「月曜日3月14日9時」、最後の月曜日の午前9時(米国東部標準時)の場合は「月曜日3月7日9時」を印刷します。

うまくいけば、別の方法がありますか?

編集:「EDT」は認識されるタイムゾーンである必要があると最初に考えましたが、「EDT」は実際のタイムゾーンではなく、タイムゾーンの状態に似ています。たとえば、要求しても意味がありませんTime.utc(2011,1,1).in_time_zone("EDT")。「EST」実際のタイムゾーンであり、夏時間を使用せず、(UTC-5)年間であるいくつかの場所で使用されるため、少し混乱します。

回答:


113

Railsには独自の名前があります。一緒に見てください:

rake time:zones:us

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

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

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

21
Webアプリにアクセスするユーザーのタイムゾーンを自動的に使用するにはどうすればよいですか?
dmonopoly 2011

私が見つけた唯一の方法は、Javascriptを使用して、それをサーバーに返すことでした。 (new Date()).getTimeZoneOffset()。:この男は自分の書かれているようですので、しかし、それは、かなり矛盾だonlineaspect.com/2007/06/08/...
デューク

2
すべてのActiveRecord日時にタイムゾーンを自動的に追加します
-config.time_zone

更新:リンクされたJSソリューションの所有者が新しいソリューションを指す:pellepim.bitbucket.org/jstz
Miles

@dmonopolyアプリケーションの設定でタイムゾーンを設定してconfig.time_zone = 'Wellington'から、Time.currentを使用できます(time.nowと同等ですが、設定したタイムゾーンを使用します)
Sean

114

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 

それが始まりです。現在のタイムゾーンを設定するにはどうすればよいですか(アプリがホストされる場所がわからないため、サーバーが使用するタイムゾーンと異なるタイムゾーンにある可能性があります)
マルク=アンドレ・Lafortune

6
"localtime"メソッドは便利ですが、コードを実行しているマシンのタイムゾーンは、Webアプリにアクセスするユーザーのタイムゾーンほど役に立ちません。(ここで述べたように:stackoverflow.com/questions/6003491/rails-3-user-timezones/…)Webアプリにアクセスしているユーザーのタイムゾーンをどのように取得できますか?
dmonopoly 2011

@dazeユーザーがタイムゾーンを選択するオプションを設定し、そのタイムゾーンでin_time_zoneメソッドを使用できると思います。
ディランマルコウ2011

1
ありがとう、localtimeメソッドはまさに私が必要としたものです。
ボブは

Time.now.localtime通常のirbセッションで動作しますが、UTCタイムゾーンのマシンで実行しようとすると動作しません。
Ava

15

システムのローカルゾーンを使用して簡単に構成できます。application.rbに追加するだけです。

config.time_zone = Time.now.zone

次に、レールはあなたの現地時間でタイムスタンプを表示する必要がありますか、この命令のようなものを使用して現地時間を取得できます

Post.created_at.localtime

15

実際には、local_timebasecampがクライアント側でのみこれらのすべてを実行するために呼び出される素晴らしいGemがあると思います。

https://github.com/basecamp/local_time


これが最適です。私たちはすでに保存されている時間を知っています。それをユーザーにフォーマットで表示する方法は、クライアント側で行うのが最善であると私は考えています。
Neeraj Shukla

1

理由はわかりませんが、私の場合、先に提案した方法では機能しません。しかし、それはこのように機能します:

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

もちろん、あなたのoffset価値観を変える必要があります。


0

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

このような:

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

config.time_zone = "Singapore"

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.