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


回答:


206
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)

irbでTime.now.in_time_zone( 'CST')を試行すると、「undefined method 'in_time_zone'」というエラーが表示されます。これを機能させるために必要なRailsクラスはありますか?
ドリュージョンソン

どのバージョンのRailsを使用していますか?Time.zone.now.in_time_zone(...)を実行すると機能しますか?
mckeed

13
これをRailsの外部で使用するには、require 'active_support/time'最初に。
sunaku

3
を実行すると、すべてのタイムゾーンを一覧表示できますrake time:zones:all。もご覧くださいrake -D time。でデフォルトのタイムゾーンを設定しますconfig/application.rb
user664833 2012

1
@AdamEberlin Railsでは通常、DateTimeではなくActiveSupport :: TimeWithZoneを使用します。このコードはすべて、Ruby DateTimeオブジェクトとTimeオブジェクトで機能します。
mckeed

6

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 

Rails 5 `Time.zone#=> Europe / Paris my_date#=> 2017年3月29日水曜日19:00:20 +0200 my_date.to_time#=>" 2017-03-29T17:00:20.000+ 00:00 "my_date.to_time.to_datetime#=> 2017年3月29日水曜日17:00:20 +0000`
Cyril Duchon-Doris

5

単純なルビでは、だけrequire 'date'で、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')}"

Mac OS X 10.13に標準で付属するruby 2.3.7でテスト済み。


3

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


TimeWithZoneをクラスにインポートするための構文は何ですか?または、デフォルトでRailsを使用して取得できますか?
ドリュージョンソン、

1
私はあなたがデフォルトでそれを手に入れると信じています。mckeedには必要なコードがありますが、irbには表示されません。Railsで実行する必要があります。
フレッド

そうです、ありがとう、フレッド。デフォルトでRailsに付属しています。私はストローをつかんで、それをirbで動作させようとしました。
ドリュージョンソン

3

RailsでActiveRecordオブジェクトを扱っている場合に備えて。

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

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


0

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

1
これは、DateTimeオブジェクトを変換する方法の質問には答えません
zykadelic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.