データベースに foo
というレコードがあり、:start_time
と :timezone
という属性を持っています。
start_timeは UTC の時刻で、例えば
2001-01-01 14:20:00などです。 timezone
は文字列で、例えば America/New_York
のようになります。
start_timeの値を持つ新しいTimeオブジェクトを作成したいのですが、そのタイムゾーンは
:timezone` で指定されています。Railsは賢いので、UTCからそのタイムゾーンと一致するように時刻を更新してしまうからです。
現状では
t = foo.start_time
=> 2000-01-01 14:20:00 UTC
t.zone
=> "UTC"
t.in_time_zone("America/New_York")
=> Sat, 01 Jan 2000 09:20:00 EST -05:00
その代わりに、私は
=> Sat, 01 Jan 2000 14:20:00 EST -05:00
ie.したいのです。
t
=> 2000-01-01 14:20:00 UTC
t.zone = "America/New_York"
=> "America/New_York"
t
=> 2000-01-01 14:20:00 EST
のようなものが欲しいようですね。
ActiveSupport::TimeZone.new('America/New_York').local_to_utc(t)
これは、このローカルタイム(ゾーンを使用)をUTCに変換することを意味します。もし Time.zone
が設定されているのであれば、もちろん
Time.zone.local_to_utc(t)
これはtに付けられたタイムゾーンを使用しません - 変換元のタイムゾーンがローカルであると仮定しています。
ここで注意しなければならないのは、夏時間の移行です。指定したローカルタイムが存在しないか、あいまいである可能性があります。
実は、変換した後にオフセットを引く必要があると思うのですが、どうでしょうか?
1.9.3p194 :042 > utc_time = Time.now.utc
=> 2013-05-29 16:37:36 UTC
1.9.3p194 :043 > local_time = utc_time.in_time_zone('America/New_York')
=> Wed, 29 May 2013 12:37:36 EDT -04:00
1.9.3p194 :044 > desired_time = local_time-local_time.utc_offset
=> Wed, 29 May 2013 16:37:36 EDT -04:00