Rails:将UTC日期时间转换为另一个时区


Answers:


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')时,出现错误“未定义的方法'in_time_zone'”。我需要一些Rails类才能使其正常工作吗?
德鲁·约翰逊

您正在使用哪个版本的Rails?如果您执行Time.zone.now.in_time_zone(...),是否可以正常工作?
mckeed 2010年

13
首先在Rails外部使用此功能require 'active_support/time'
sunaku 2012年

3
您可以通过运行列出所有时区rake time:zones:all。另请参阅rake -D time。在中设置默认时区config/application.rb
user664833'4

1
@AdamEberlin在Rails中,通常使用ActiveSupport :: TimeWithZone,而不是DateTime。所有这些代码都适用于ruby DateTime对象以及Time对象。
mckeed 2012年

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#=>欧洲/巴黎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#=> Wed,2017年3月29日星期三17:00:20 +0000`–
西里尔·杜松-多丽丝

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


3

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


将TimeWithZone导入类的语法是什么?还是我默认使用Rails来获得它?
德鲁·约翰逊

1
我相信您默认情况下会得到它。mckeed具有您需要的代码,但是您不会在irb中看到它。您需要在Rails中运行它。
弗雷德

您说得对-谢谢,弗雷德-默认情况下,Rails附带了它。我正在抓住稻草,试图使其在irb中工作。
德鲁·约翰逊


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.