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


Ответы:


207
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'), я получаю сообщение об ошибке «undefined method 'in_time_zone'». Есть ли классы рельсов, которые мне нужны, чтобы заставить это работать?
Дрю Джонсон,

Какую версию Rails вы используете? Работает ли Time.zone.now.in_time_zone (...)?
mckeed

13
Во- require 'active_support/time'первых, чтобы использовать это вне Rails .
sunaku

3
Вы можете перечислить все часовые пояса, запустив rake time:zones:all. Также см rake -D time. Установите часовой пояс по умолчанию в формате config/application.rb.
user664833 05

1
@AdamEberlin В Rails вы обычно используете ActiveSupport :: TimeWithZone, а не DateTime. Весь этот код работает как с объектами Ruby DateTime, так и с объектами Time.
mckeed 06

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 # => Europe / Paris my_date # => среда, 29 марта 2017 г. 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ 00:00 "my_date.to_time.to_datetime # => среда, 29 марта 2017 г. 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')}"

Протестировано с Ruby 2.3.7, входящим в стандартную комплектацию Mac OS X 10.13.


3

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


Какой синтаксис для импорта TimeWithZone в мой класс? Или я получу это по умолчанию с Rails?
Дрю Джонсон,

1
Я считаю, что вы получаете это по умолчанию. В mckeed есть нужный вам код, но вы не увидите его в irb. Вам нужно запустить его в Rails.
Фред

Ты прав - спасибо, Фред - по умолчанию он идет с Rails. Я цеплялся за соломинку, пытаясь заставить ее работать в irb.
Дрю Джонсон,

3

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

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

Более подробную информацию я объясню на https://stackoverflow.com/a/25055692/542995


0

Я использую 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

1
Это не отвечает на вопрос, как вы конвертируете объекты DateTime
zykadelic
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.