web-dev-qa-db-ja.com

Rails:UTC DateTimeを別のタイムゾーンに変換します

Ruby/Railsでは、UTC DateTimeを別のタイムゾーンに変換するにはどうすればよいですか?

105
Drew Johnson
time.in_time_zone(time_zone)

例:

zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)

あるいは単に

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

ActiveSupportタイムゾーンの名前は、次の方法で見つけることができます。

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
196
mckeed

if Time.zone希望するタイムゾーンです。@date.to_time.to_datetime

> @date
=> Tue, 02 Sep 2014 23:59:59 +0000
> @date.class
=> DateTime
> @date.to_time
=> 2014-09-02 12:59:59 -1100
> @date.to_time.to_datetime
=> Tue, 02 Sep 2014 12:59:59 -1100 
6
vladCovaliov

ActiveSupportの TimeWithZone TimeZoneで操作されるオブジェクトを試してください。 ActiveSupportは、UTC時間を指定されたTimeZoneタイムゾーンに変換するin_time_zoneメソッドも提供します。 mckeedの答えはコードを示しています。

3
Fred

念のため、RailsでActiveRecordオブジェクトを扱っている場合。

Time.use_zoneで設定されたデフォルトのタイムゾーンをオーバーライドするリクエストごとのタイムゾーンにconfig.time_zoneを使用することをお勧めします

https://stackoverflow.com/a/25055692/542995 で説明する詳細

3
zdk

require 'date'のみを使用するプレーンRubyでは、new_offsetメソッドを使用します。

require 'date'

d=DateTime.parse('2000-01-01 12:00 +0200')
l=d.new_offset('-0700')
u=l.new_offset('UTC')
puts "#{u.strftime('%a %F %T %Z')} ❖ #{l.strftime('%a %F %T %Z')}"

Ruby 2.3.7でテスト済みで、Mac OS X 10.13に標準で付属しています。

2
jbyler

Rails 4でsimple_formを使用しています。入力フィールドを次のように追加しました。

<%= f.input :time_zone, :as => :time_zone %>

移行に伴い

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end
0
maudulus