Rails: convert UTC DateTime to another time zone

在 Ruby/Rails 中,如何将 UTC DateTime 转换为另一个时区?

98078 次浏览
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)")

You can find the names of the ActiveSupport time zones by doing:

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

尝试使用 TimeZone 操作 ActiveSupport 的 时间与地带对象。ActiveSupport 还提供了 in _ time _ zone 方法,用于将 UTC 时间转换为指定的 TimeZone 时区。Mckeed 的答案显示了密码。

I'm using simple_form in Rails 4 and I just added the input field as

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

随着迁徙

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

以防万一,如果您在 Rails 中处理 ActiveRecord 对象。

对于每个请求基准时区使用 Time.use_zone可能是一个好主意,它覆盖在 config.time_zone中设置的默认时区

更多细节我在 https://stackoverflow.com/a/25055692/542995上解释

if Time.zone it's your desired time zone then you can use @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

在纯红宝石中,只使用 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')}"

使用 MacOSX10.13的标准版 Ruby 2.3.7进行测试。