In Ruby / Rails, come posso convertire un DateTime UTC in un altro fuso orario?
In Ruby / Rails, come posso convertire un DateTime UTC in un altro fuso orario?
Risposte:
time.in_time_zone(time_zone)
Esempio:
zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)
o semplicemente
Time.now.in_time_zone("Central Time (US & Canada)")
Puoi trovare i nomi dei fusi orari di ActiveSupport facendo:
ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
require 'active_support/time'
prima.
rake time:zones:all
. Vedi anche rake -D time
. Imposta il fuso orario predefinito in config/application.rb
.
se Time.zone
è il fuso orario desiderato, puoi utilizzarlo@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
In plain ruby, con solo require 'date'
, usa il new_offset
metodo:
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')}"
Testato con ruby 2.3.7 fornito di serie su Mac OS X 10.13.
Prova gli oggetti TimeWithZone di ActiveSupport manipolati con TimeZone. ActiveSupport fornisce anche il metodo in_time_zone per convertire un'ora UTC in un fuso orario TimeZone specificato. La risposta di mckeed mostra il codice.
Per ogni evenienza, se hai a che fare con un oggetto ActiveRecord in Rails.
Potrebbe essere una buona idea utilizzare Time.use_zone
per un fuso orario base per richiesta che sostituisce il fuso orario predefinito impostato inconfig.time_zone
Maggiori dettagli spiego su https://stackoverflow.com/a/25055692/542995
Sto usando simple_form in Rails 4 e ho appena aggiunto il campo di input come
<%= f.input :time_zone, :as => :time_zone %>
con la migrazione
class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
def change
add_column :textmessages, :time_zone, :string
end
end