Rails: convert UTC DateTime to another time zone
在Ruby / Rails中,如何将UTC DateTime转换为另一个时区?
1 | time.in_time_zone(time_zone) |
例:
1 2 | zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)") Time.now.in_time_zone(zone) |
要不就
1 | Time.now.in_time_zone("Central Time (US & Canada)") |
您可以通过执行以下操作找到ActiveSupport时区的名称:
1 2 3 | ActiveSupport::TimeZone.all.map(&:name) # or for just US ActiveSupport::TimeZone.us_zones.map(&:name) |
如果
1 2 3 4 5 6 7 8 | > @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中处理ActiveRecord对象。
对于每个请求基础时区使用
更多细节我在https://stackoverflow.com/a/25055692/542995上解释
尝试使用TimeZone操作的ActiveSupport的TimeWithZone对象。 ActiveSupport还提供in_time_zone方法,用于将UTC时间转换为指定的TimeZone时区。 mckeed的答案显示了代码。
在纯红宝石中,仅使用
1 2 3 4 5 6 | 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测试。
我在Rails 4中使用simple_form,我只是将输入字段添加为
1 | <%= f.input :time_zone, :as => :time_zone %> |
随着迁移
1 2 3 4 5 | class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration def change add_column :textmessages, :time_zone, :string end end |