Carriles: convierte UTC DateTime a otra zona horaria

Respuestas:

206
time.in_time_zone(time_zone)

Ejemplo:

zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)

o solo

Time.now.in_time_zone("Central Time (US & Canada)")

Puede encontrar los nombres de las zonas horarias de ActiveSupport haciendo lo siguiente:

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
mckeed
fuente
En irb, cuando intento Time.now.in_time_zone ('CST'), aparece el error "método indefinido 'in_time_zone'". ¿Hay clases de rieles que necesito para que esto funcione?
Drew Johnson
¿Qué versión de Rails estás usando? ¿Funciona si hace Time.zone.now.in_time_zone (...)?
medido el
13
Para usar esto fuera de los rieles, require 'active_support/time'primero.
sunaku
3
Puede enumerar todas las zonas horarias ejecutando rake time:zones:all. También vea rake -D time. Establezca la zona horaria predeterminada en config/application.rb.
user664833
1
@AdamEberlin En Rails usualmente usa ActiveSupport :: TimeWithZone, no DateTime. Todo este código funciona tanto en objetos Ruby DateTime como en objetos Time.
Mckeed
6

si Time.zonees su zona horaria deseada, puede usar@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 
vladCovaliov
fuente
No funciona en 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 # => Mié, 29 de marzo de 2017 17:00:20 +0000`
Cyril Duchon-Doris
5

En rubí simple, con solo require 'date', use el new_offsetmétodo:

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')}"

Probado con ruby ​​2.3.7 que viene de serie en Mac OS X 10.13.

jbyler
fuente
3

Pruebe los objetos TimeWithZone de ActiveSupport manipulados con TimeZone. ActiveSupport también proporciona el método in_time_zone para convertir una hora UTC en una zona horaria específica. La respuesta de mckeed muestra el código.

Fred
fuente
¿Cuál es la sintaxis para importar TimeWithZone a mi clase? ¿O lo obtengo por defecto con Rails?
Drew Johnson
1
Creo que lo obtienes por defecto. mckeed tiene el código que necesita, pero no lo verá en irb. Necesitas ejecutarlo en Rails.
Fred
Tienes razón, gracias Fred, viene con Rails por defecto. Estaba agarrando pajitas, tratando de que funcionara en irb.
Drew Johnson
3

Por si acaso, si se trata de un objeto ActiveRecord en Rails.

Puede ser una buena idea utilizar Time.use_zoneuna zona horaria por solicitud que anule la zona horaria predeterminada establecida enconfig.time_zone

Más detalles que explico en https://stackoverflow.com/a/25055692/542995

zdk
fuente
0

Estoy usando simple_form en Rails 4 y acabo de agregar el campo de entrada como

<%= f.input :time_zone, :as => :time_zone %>

con la migración

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end
maudulus
fuente
1
Esto no responde a la pregunta de cómo convertir objetos DateTime
zykadelic