Techioz Blog

Ruby または Rails で東部時間を UTC に変換する最良の方法は何ですか?

概要

言及しているわけではありません

myDateTime = DateTime.now
myDateTime.new_offset(Rational(0, 24))

または

Time.now.utc

私が持っているのは、テキストの日付が東部時間で表示されているということです。

そのテキスト日付を DateTime に変換できます。それを east_date_time と呼びましょう。

さて、DateTime を含む変数がありますが、それが東部であることは私たち以外に誰も知りません。自分で変換するのはかなり面倒です。日付が夏時間 (DST) の場合 (今年は 3 月 8 日から 11 月 1 日まで)、UTC を取得するには Eastern_date_time 変数に 4 時間を追加する必要があります。日付が標準時 (ST) の場合は、次のようにします。 east_date_time 変数に 5 時間を追加する必要があります。

取得したものが東部 DateTime であることを指定し、それを UTC に変換するにはどうすればよいでしょうか…日付が DST/ST であるかどうかを判断し、4 時間または 5 時間を適切に適用するにはどうすればよいでしょうか?

取得したあらゆる種類の日付を UTC に変換して、データベースに保存したいと考えています。

編集:

編集:

text_time = "Nov 27, 2015 4:30 PM" #given as Eastern
myEasternDateTime = DateTime.parse text_time # => Fri, 27 Nov 2015 16:30:00 +0000 
#now we need to specify that this myEasternDateTime is in fact eastern. However, it's our default UTC. If we use in_time_zone, it just converts the date at UTC to Eastern
myEasternDateTime.in_time_zone('Eastern Time (US & Canada)') # => Fri, 27 Nov 2015 11:30:00 EST -05:00 
myEasternDateTime.utc # => Fri, 27 Nov 2015 16:30:00 +0000 

それは私たちが望んでいることではありません。 myEasterDateTime が実際には東部であることを指定する必要があります。そのため、16:30:00 に myEasterDateTime.utc を実行すると、最終的には 20:30:00 になります。

どうすればこれを達成できますか?

解決策

DateTime クラスには time_in_zone メソッドがありました。

now.time_in_zone('UTC')

その後、名前が in_time_zone に変更されました。

DateTime.now.in_time_zone('US/Pacific')
 => Wed, 22 Apr 2015 12:36:33 PDT -07:00 

現在 (2023 / Rails 7) では、次の方法で米国のすべてのゾーンのリストを取得できます。

ActiveSupport::TimeZone.us_zones.collect(&:name)

または別の国については:

ActiveSupport::TimeZone.country_zones('ES')