Rails: конвертировать UTC DateTime в другой часовой пояс

В Ruby/Rails, как мне преобразовать UTC DateTime в другой часовой пояс?

Ответ 1

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)

Ответ 2

если 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 

Ответ 3

Попробуйте ActiveSupport TimeWithZone объекты, обработанные с помощью TimeZone. ActiveSupport также предоставляет метод in_time_zone для преобразования времени UTC в указанный часовой пояс TimeZone. Ответ mckeed показывает код.

Ответ 4

На всякий случай, если вы имеете дело с объектом ActiveRecord в Rails.

Это может быть хорошей идеей использовать Time.use_zone для часового пояса на основе запроса, который отменяет часовой пояс по умолчанию, установленный в config.time_zone

Подробнее я объясняю в fooobar.com/questions/60191/...

Ответ 5

Я использую simple_form в Rails 4, и я просто добавил поле ввода как

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

с миграцией

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