【发布时间】:2011-02-11 08:32:57
【问题描述】:
在 Ruby/Rails 中,如何将 UTC 日期时间转换为另一个时区?
【问题讨论】:
标签: ruby-on-rails ruby datetime runtime
在 Ruby/Rails 中,如何将 UTC 日期时间转换为另一个时区?
【问题讨论】:
标签: ruby-on-rails ruby datetime runtime
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)
【讨论】:
require 'active_support/time' 首先。
rake time:zones:all 列出所有时区。另见rake -D time。在config/application.rb中设置默认时区。
如果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
【讨论】:
在纯 ruby 中,只有 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 进行测试。
【讨论】:
尝试使用 TimeZone 操作的 ActiveSupport 的 TimeWithZone 对象。 ActiveSupport 还提供了 in_time_zone 方法,用于将 UTC 时间转换为指定的 TimeZone 时区。 mckeed 的回答显示了代码。
【讨论】:
以防万一,如果您在 Rails 中处理 ActiveRecord 对象。
最好将Time.use_zone 用于覆盖config.time_zone 中设置的默认时区的每个请求的时区
【讨论】:
我在 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
【讨论】: