1. ホーム
  2. ruby-on-rails

[解決済み] Ruby / Rails - Timeの値を変更せずに、タイムゾーンを変更する。

2022-08-16 12:29:14

質問

あるレコード foo を持つデータベースで :start_time:timezone 属性があります。

:start_time はUTCのTime -です。 2001-01-01 14:20:00 のように、例えば は :timezone は文字列- America/New_York のように、例えば

の値を持つ新しいTimeオブジェクトを作りたい。 :start_time の値を持つ新しい Time オブジェクトを作りたいのですが、そのタイムゾーンは :timezone . を読み込ませたくない。 :start_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に添付されたタイムゾーンを使用しません - 変換元のタイムゾーンのローカルであると仮定します。

ここで注意すべきは、夏時間の移行です。指定したローカルな時間が存在しないか、あいまいである可能性があります。