Як перетворити UTC DateTime в інший часовий пояс у Ruby / Rails?
Як перетворити UTC DateTime в інший часовий пояс у Ruby / Rails?
Відповіді:
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')}"
Тестований на рубіні 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