Rails: converte UTC DateTime in un altro fuso orario


Risposte:


206
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)

In irb, quando provo Time.now.in_time_zone ('CST'), ottengo l'errore "undefined method 'in_time_zone'". Ci sono classi rails di cui ho bisogno per farlo funzionare?
Drew Johnson

Quale versione di Rails stai usando? Funziona se esegui Time.zone.now.in_time_zone (...)?
mckeed

13
Per usarlo al di fuori di Rails, require 'active_support/time'prima.
sunaku

3
Puoi elencare tutti i fusi orari correndo rake time:zones:all. Vedi anche rake -D time. Imposta il fuso orario predefinito in config/application.rb.
user664833

1
@AdamEberlin In Rails di solito usi ActiveSupport :: TimeWithZone, non DateTime. Tutto questo codice funziona sugli oggetti DateTime ruby ​​così come sugli oggetti Time.
mckeed

6

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 

Non funziona su Rails 5 `Time.zone # => Europe / Paris my_date # => Wed, 29 Mar 2017 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ 00:00 "my_date.to_time.to_datetime # => Mercoledì, 29 marzo 2017 17:00:20 +0000"
Cyril Duchon-Doris

5

In plain ruby, con solo require 'date', usa il new_offsetmetodo:

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.


3

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.


Qual è la sintassi per importare TimeWithZone nella mia classe? O lo ottengo di default con Rails?
Drew Johnson

1
Credo che tu lo ottenga per impostazione predefinita. mckeed ha il codice che ti serve, ma non lo vedrai in irb. Devi eseguirlo in Rails.
Fred

Hai ragione - grazie, Fred - viene fornito con Rails per impostazione predefinita. Mi stavo aggrappando alle cannucce, cercando di farlo funzionare in irb.
Drew Johnson

3

Per ogni evenienza, se hai a che fare con un oggetto ActiveRecord in Rails.

Potrebbe essere una buona idea utilizzare Time.use_zoneper 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


0

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

1
Questo non risponde alla domanda su come convertire gli oggetti DateTime
zykadelic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.