Rails:将UTC DateTime转换为另一个时区

时间:2010-04-23 02:33:20

标签: ruby-on-rails ruby datetime runtime

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

6 个答案:

答案 0 :(得分:193)

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)

答案 1 :(得分: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 

答案 2 :(得分:3)

尝试使用TimeZone操纵ActiveSupport的TimeWithZone个对象。 ActiveSupport还提供in_time_zone方法,用于将UTC时间转换为指定的TimeZone时区。 mckeed的答案显示了代码。

答案 3 :(得分:3)

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

对于每个请求基准时区使用Time.use_zone覆盖config.time_zone

中设置的默认时区可能是个好主意

我在https://stackoverflow.com/a/25055692/542995

解释的更多细节

答案 4 :(得分:2)

在只有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上使用红宝石2.3.7进行了测试。

答案 5 :(得分: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