Как в Ruby / Rails преобразовать DateTime в формате UTC в другой часовой пояс?
Как в Ruby / Rails преобразовать DateTime в формате UTC в другой часовой пояс?
Ответы:
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'
первых, чтобы использовать это вне Rails .
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
В простом рубине 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.
Попробуйте объекты TimeWithZone ActiveSupport, управляемые с помощью TimeZone. ActiveSupport также предоставляет метод in_time_zone для преобразования времени UTC в указанный часовой пояс TimeZone. Ответ mckeed показывает код.
На всякий случай, если вы имеете дело с объектом ActiveRecord в Rails.
Было бы неплохо использовать Time.use_zone
для каждого запроса часовой пояс, который переопределяет часовой пояс по умолчанию, установленный вconfig.time_zone
Более подробную информацию я объясню на https://stackoverflow.com/a/25055692/542995
Я использую 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